两种实现方式
一、__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中默认是顶级命名空间