说说php自动加载类方法
php的自动加载方法有2种, 分别是__autoload和spl_autoload_register, 前者官方说不推荐使用, 未来可能废除, 所以这里就说说后者, 其实两者功能上差别不大….
spl_autoload_register 这个方法正如其名, 注册一个autoload的自动加载函数…
demo:
<?php
spl_autoload_register('load');
function load($className)
{
echo $className,'<br>';
include "{$className}.php";
}
$obj2 = new MyClass();
?>
例如上面这个例子这样, 当实例化一个未加载的class的时候(即class_exists(class_name)===false), 会自动运行spl_autoload_register注册的自动加载函数(也就是这里的load), 然后会类名当初参数传递过去…
比较牛B的是, 这个函数连继承的父类class 或者 接口都能捕捉到….
<?php
spl_autoload_register('load');
function load($className)
{
echo $className,'<br>';
include "{$className}.php";
}
$obj2 = new MyClass();
//------------
//MyClass.php
class MyClass extends MyClass2
{
function __construct()
{
parent::__construct();
echo ' I am class1';
}
}
//-------------
//MyClass2.php
class MyClass2 implements MyClass3
{
function __construct()
{
echo ' I am class2';
}
}
?>
以上代码运行结果是: MyClass MyClass2 MyClass3
不仅如此, 如果使用命名空间, 也可以正确识别…一些PHP框架的自动加载机制也是基于这个自动加载方法来实现的, 所以一般都会在类命名上下功夫, 例如 APP_Model_User 这样来定位该类的所在目录…