资讯专栏INFORMATION COLUMN

自动加载与命名空间

songjz / 2264人阅读

摘要:不传参数,直接调用,会默认调用来加载类,如果后面再调用有传参数的,也会失效的如果使用了命名空间,那么会把路径和类名一同带过来的。

自动加载

两种实现方式
1、__autoload();
2、spl_autoload_register(); (主要使用)

__autoload()
现在很少使用,因为使用这种方式,在一个系统的实现中,假如需要使用很多其它的类库,这些类库可能是由不同的开发工程师开发,其类名与实际的磁盘文件的映射规则不尽相同。这时假如要实现类库文件的自动加载,就必须在__autoload()函数中将所有的映射规则全部实现,因此__autoload()函数有可能会非常复杂,甚至无法实现。最后可能会导致__autoload()函数十分臃肿,这时即便能够实现,也会给将来的维护和系统效率带来很大的负面影响。在这种情况下,在PHP5引入SPL标准库,一种新的解决方案,即spl_autoload_register()函数。

   function __autoload($class_name) {   
      require_once ($class_name . “class.php”);   
   }   
   $memo= new Demo();

spl_autoload_register()

此函数的功能就是把函数注册至SPL的__autoload函数栈中,并移除系统默认的__autoload()函数。

不传参数,直接调用**spl_autoload_register()**,会默认调用spl_autoload()来加载类,如果后面再调用**spl_autoload_register()**(有传参数的),也会失效的
*如果使用了命名空间,那么$class_name会把路径和类名一同带过来的。*
命名空间

主要技术点

    *namespace* (定义命名空间)
    *use* (使用命名空间的快捷方式)
    \__NAMESPACE\__ (获取当前命名空间)

命名空间分类

    1、**逻辑命名空间**----与实际物理地址没有任何关系
    2、**物理命名空间**----按照实际目录结构定义的(*推荐使用*,方便寻址)

定义命名空间

    namespace wt	aobao;
    注意:必须使用**反斜杠**,而且开头不能以反斜杠开头

使用命名空间

    1、**非限定名称**(调用当前命名空间的类)
    2、**限定名称**(调用当前命名空间的子命名空间的类)
    3、**完全限定名称**(调用非当前命名空间或非当前命名空间的子空间的类)

命名空间的价值

    解决2个问题:
    1、用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
    2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

命名空间的作用域

只有 函数常量 能存在作用域下(其余元素不会存在在命名空间中)

注意:
1、变量不受命名空间(逻辑路径)作用,变量是全局的
例如:$name = "xcxcx";
2、能使用命名空间的常量,只能是const定义的常量,而define定义的常量是全局,不受命名空间作用
例如:const CON = "xcxcsdw";
3、在嵌套的情况下(例如:a.php嵌套b.php),b.php中的函数、类、常量不会继承a.php中的命名空间,而b.php中默认是顶级命名空间

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22180.html

相关文章

  • PHP自动加载功能原理解析

    摘要:前言在开始之前,欢迎关注我自己的博客这篇文章是对自动加载功能的一个总结,内容涉及的自动加载功能的命名空间的与标准等内容。要实现第一步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。 前言 在开始之前,欢迎关注我自己的博客:www.leoyang90.cn 这篇文章是对PHP自动加载功能的一个总结,内容涉及PHP的自动加载功能、P...

    Imfan 评论0 收藏0
  • Composer的Autoload源码实现——启动初始化

    摘要:任务是加载类的初始化顶级命名空间与文件路径映射初始化和注册。在实际情况下可能会出现这样的情况。值得注意的是这个函数返回的是一个匿名函数,为什么呢原因就是类中的等等都是的。。。关于匿名函数的绑定功能。 前言 在开始之前,欢迎关注我自己的博客:www.leoyang90.cn 上一篇文章,我们讨论了 PHP 的自动加载原理、PHP 的命名空间、PHP 的 PSR0 与 PSR4 标准,有...

    MarvinZhang 评论0 收藏0
  • ThinkPHP5.1 源码浅析(二)自动加载机制

    摘要:如果遍历后没有找到,则加载失败。在之后碰到了之后直接拿来用,提高系统自动加载的性能。这里我们就讲完了注册自动加载。使用自动加载我们在中定义了我们自动加载函数式方法。 继 生命周期的第二篇,大家尽可放心,不会随便鸽文章的 第一篇中,我们提到了入口脚本,也说了,里面注册了自动加载的功能 本文默认你有自动加载和命名空间的基础。如果没有请 看此篇文章 php 类的自动加载与命名空间 自动加载...

    mudiyouyou 评论0 收藏0
  • PSR-4:自动加载

    摘要:概述这份声明了关于从文件路径自动加载类的规范。当根据完全限定类名加载对应的文件时由最开始的命名空间开始,连续的一个或多个命名空间组成的序列,不包括最前面的命名空间分隔符,在这个完全限定类名中这个序列称为命名空间前缀,对应了至少一个基础目录。 PSR-4:自动加载 翻译:薛粲授权许可:CC BY-NC 4.0 这份文档是《PSR-4: Autoloader》的非官方译文。 英文原文使用的...

    ZweiZhao 评论0 收藏0
  • Composer的Autoload源码实现——注册运行

    前言 在开始之前,欢迎关注我自己的博客:www.leoyang90.cn上一篇 文章我们讲到了 Composer 自动加载功能的启动与初始化,经过启动与初始化,自动加载核心类对象已经获得了顶级命名空间与相应目录的映射,换句话说,如果有命名空间 AppConsoleKernel,我们已经知道了 App 对应的目录,接下来我们就要解决下面的就是 ConsoleKernel这一段。 注册 我们先回顾...

    wanghui 评论0 收藏0

发表评论

0条评论

songjz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<