起源 : 写这篇文章的灵感来自我的php Boss, 在这里也感谢下我的Boss哈哈。
老大经常在面试的时候会问面试者一个基础问题, “php自动加载的原理是什么?”
虽然整体原理简单,但是面试者回答结果往往不尽人意;
在php5之前是面向过程编程,那个时候很多人都会有一个贼难受的点,每个php文件头部都有一段长长的include or require or xx_one;
面向对象时解决了这个问题,那就是自动加载;__aotuload();
列子
<?php
__aotuload($className){
require_once $className . '.php';
}
//在这里new时找不到该class时,会自动调用 __aotuload方法进行引入
$obj = new MyClass1();
$obj2 = new MyClass2()
但是这种方法有一个很大的缺点,如果你的项目要和另外一个项目代码融合, 这个时候需要把两个aotuload改为一个;
php5.3之后官方推荐使用 spl_aotuload_register ;
例子
<?php
spl_autoload_register('aotuload1');function aotuload1($className){
require_once $className . '.php';
}
spl_autoload_register('aotuload2');
function aotuload2($className){
require_once '../' . $className . '.php';
}
//在这里new时找不到该class时,会自动调用 aotuload1 、aotuload2方法进行引入
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
如果这里使用了命名空间,className参数内容会包含该class的命名空间;
spl_autoload_register函数更像是一个将自动加载方法注册到php的一个队列里之后再依次调用;(个人理解)