自动加载与命名空间

自动加载

  • 两种实现方式
    一、__autoload();
    二、spl_autoload_register(); (主要使用)php

  • __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()ui

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

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

命名空间

  • 主要技术点code

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

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

namespace wt\\taobao;
    注意:必须使用**反斜杠**,并且开头不能以反斜杠开头
  • 使用命名空间开发

一、**非限定名称**(调用当前命名空间的类)
    二、**限定名称**(调用当前命名空间的子命名空间的类)
    三、**彻底限定名称**(调用非当前命名空间或非当前命名空间的子空间的类)
  • 命名空间的价值io

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

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

注意:
一、变量不受命名空间(逻辑路径)做用,变量是全局的
例如:$name = 'xcxcx';
二、能使用命名空间的常量,只能是const定义的常量,而define定义的常量是全局,不受命名空间做用
例如:const CON = 'xcxcsdw';
三、在嵌套的状况下(例如:a.php嵌套b.php),b.php中的函数、类、常量不会继承a.php中的命名空间,而b.php中默认是顶级命名空间
相关文章
相关标签/搜索