刚接触PHP,往往会被PHP文件结构搞晕,类似于C++,需要用到其他文件中的类或方法时,需要将类或方法的定义引入进来。同样类似于C++,PHP可以使用 include。不同的是,除了include,PHP还提供了另一个函数require。所以我们先看一下require和include 的区别。
一、 require和include异同
- 相同点
都有另一个函数 require_once,include_once ,表示已加载的不加载。
- 不同点
引入条件:include()是有条件包含函数,而require()则是无条件包含函数。require 在PHP编译时将内容引入,所以不论放在哪,都是首先执行。include是运行时才会引入。所以,require()通常来导入静态的内容,而include()则适合用导入动态的程序代码。
二、autoload
PHP 5 提供魔术函数 _autoload,当调用的类找不到时,将类名传入,再给一次引入类声明的机会。
function __autoload($class_name)
{
if (file_exists($class_name . '.php')) {
require_once $class_name . '.php';
} elseif (file_exists('../Entity/' . $class_name . '.php')) {
require_once '../Entity/' . $class_name . '.php';
}
}
但是在交叉引用中,可能导致_autoload多次定义,出现错误。
所以在PHP 5.1.2 以后支持自定义autoload函数,通过spl_autoload_register()将函数注册到队列中。
function my_autoloader($class) {
include 'classes/' . $class . '.class.php';
}
spl_autoload_register('my_autoloader');
三、分析项目组框架pylon中autoload用法
function pylonlib__autoload($classname)
{
$key = "PYLON2_CLASS:" . $classname;
$glogger = new logger("_pylon");
$path = pylon_dict_find($key);
if ($path != null) {
$glogger->debug("cls : $classname , file: $path", "autoload");
if (extension_loaded("Zend OPcache")) {
include_once realpath("$path");
} else {
include_once "$path";
}
return;
}
}
上述代码中将特定字符串与类名拼接作为key在之前导入的字典中查找类对应的文件路径,如果找到,则include。
这里将类名和路径作为键值提前记录好存储起来以供查询用。