php的命名空间和自动加载

引子

我们先前讲过类的自动加载,然后我就在思索。

我们写代码的时候,每在另一个文件中调用其他类时
我们并没有写spl_autoload_register这个方法啊?那我们时怎么实现的呢?

原理

原来啊,我们php在5.3时引入了命名空间的概念(这也是为什么大多数的框架不支持5.3之前的版本原因之一)

命名空间大家多少还是了解的吧:不知道的去墙角面壁思过

命名空间简而言之就是一种标识,它的主要目的是解决命名冲突的问题。

就像在日常生活中,有很多姓名相同的人,如何区分这些人呢?那就需要加上一些额外的标识。

把工作单位当成标识似乎不错,这样就不用担心 “撞名” 的尴尬了。

命名空间分类
  • [ ] 完全限定命名空间
  • [ ] 限定命名空间

new 百度\李彦宏(); // 限定类名
new \百度\李彦宏(); // 完全限定类名

在当前命名空间没有声明的情况下,限定类名和完全限定类名是等价的。因为如果不指定空间,则默认为全局(\)。



namespace 谷歌;

new 百度\李彦宏(); // 谷歌\百度\李彦宏(实际结果)
new \百度\李彦宏(); // 百度\李彦宏(实际结果)

这个例子展示了在命名空间下,使用限定类名和完全限定类名的区别。(完全限定类名 = 当前命名空间 + 限定类名)

/* 导入命名空间 */
use 百度\李彦宏;
new 李彦宏(); // 百度\李彦宏(实际结果)

/* 设置别名 */
use 百度\李彦宏 AS CEO;
new CEO(); // 百度\李彦宏(实际结果)

/* 任何情况 */
new \百度\李彦宏();// 百度\李彦宏(实际结果)

使用命名空间只是让类名有了前缀,不容易发生冲突,系统仍然不会进行自动导入。

如果不引入文件,系统会在抛出 “Class Not Found” 错误之前触发 __autoload 函数,并将限定类名传入作为参数。

所以上面的例子都是基于你已经将相关文件手动引入的情况下实现的,否则系统会抛出 ” Class ‘百度\李彦宏’ not found”。

所以在引入命名空间以后右引入了自动加载

类的自动加载

类的自动加载在前面我们讲spl_autoload_register的时候已经和大家讲过了。今天我们讲另一种
__autoload()

php的__autoload函数是一个魔术函数,在这个函数出现之前,如果一个php文件里引用了100个对象,那么这个文件就需要使用include或require引进100个类文件,这将导致该php文件无比庞大。于是就有了这个 __autoload函数。

__autoload函数在什么时候调用呢?当php文件中使用了new关键字实例化一个对象时,如果该类没有在本php文件中被定义,将会触发__autoload函数,此时,就可以引进定义该类的php文件,尔后,就能实例化成功了。(注意:如果需要实例化的对象,在本文件中已经找到该类的定义的话,就不会触发__autoload函数)

他和spl_autoload_register的区别就在于

当文件中同时出现__autoload和spl_autoload_register时,以spl_autoload_register为准

猜你喜欢

转载自blog.csdn.net/qq_36172443/article/details/79996618