自动加载
两种实现方式
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中默认是顶级命名空间