自动加载与命名空间

自动加载

  • 两种实现方式
    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\\taobao;
    注意:必须使用**反斜杠**,而且开头不能以反斜杠开头
  • 使用命名空间

    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中默认是顶级命名空间

你可能感兴趣的:(php)