详情页

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

时间:2024年01月26日

编辑:佚名

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 之后才支持。
命名空间简而言之就是一种标识,它的主要目的是解决命名冲突的问题。
就像在日常生活中,有很多姓名相同的人,如何区分这些人呢?那就需要加上一些额外的标识。
把工作单位当成标识似乎不错,这样就不用担心 “撞名” 的尴尬了。
相关文章
猜你需要