您现在的位置是:首页 > 学无止境 > PHPPHP

PHP 命名空间和自动加载原理与用法实例分析

AndyGuo2020-05-22 01:05:25PHP1788人已围观

简介include 和 require 是PHP中引入文件的两个基本方法。在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会...

include 和 require 是PHP中引入文件的两个基本方法。在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会造成大量的 include 和 require 堆积。这样的代码既不优雅,执行效率也很低,而且维护起来也相当困难。


为了解决这个问题,部分框架会给出一个引入文件的配置清单,在对象初始化的时候把需要的文件引入。但这只是让代码变得更简洁了一些,引入的效果仍然是差强人意。PHP5 之后,随着 PHP 面向对象支持的完善,__autoload 函数才真正使得自动加载成为可能。


* include 和 require 功能是一样的,它们的不同在于 include 出错时只会产生警告,而 require 会抛出错误终止脚本。


* include_once 和 include 唯一的区别在于 include_once 会检查文件是否已经引入,如果是则不会重复引入。


自动加载


实现自动加载最简单的方式就是使用 __autoload 魔术方法。当需要使用的类没有被引入时,这个函数会在PHP报错前被触发,未定义的类名会被当作参数传入。至于函数具体的逻辑,这需要用户自己去实现。


首先创建一个 autoload.php 来做一个简单的测试:


// 类未定义时,系统自动调用

function __autoload($class)

{

 /* 具体处理逻辑 */

 echo $class;// 简单的输出未定义的类名

}


new HelloWorld();


/**

 * 输出 HelloWorld 与报错信息

 * Fatal error: Class 'HelloWorld' not found

 */


通过这个简单的例子可以发现,在类的实例化过程中,系统所做的工作大致是这样的:


明白了 __autoload 函数的工作原理之后,那就让我们来用它去实现自动加载。


首先创建一个类文件(建议文件名与类名一致),代码如下:


命名空间


其实命名空间并不是什么新生事物,很多语言(例如C++)早都支持这个特性了。只不过 PHP 起步比较晚,直到 PHP 5.3 之后才支持。


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


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


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


这里我们来做一个小任务,去介绍百度的CEO李彦宏:


小郭博客

标签云 更多

关闭
QQ 微信 支付宝扫一扫打赏