spl_autoload_register 与__autoload
spl_autoload_register 与__autoload都是尝试加载未定义的类。一般我们是实例化一个类比如new Foo();就是需要先include('Foo.php');使用spl_autoload_register 与__autoload就可以避免这种操作,减少include代码。
区别
spl_autoload_register允许存在多个自动加载器,而__autoload只允许一个加载器。
__autoload将在php7.2中放弃。
利用spl_autoload_register实现简单的命名空间自动加载案例
//Load.php
class Load{
//声明命名空间与目录的映射
public static $vendorMap = array(
'app' => ROOT_DIR . DIRECTORY_SEPARATOR . 'app',
);
/**
自动加载器
*/
public static function autoLoad($class)
{
$file = self::findClassFile($class);
if(file_exists($file))
{
include($file);
}else
{
throw new Exception("Error $file Not Found", 1);
}
}
/**
* 解析文件路径
*/
public static function findClassFile($class)
{
//class = app\controllers\Index
//strpos 获取字符串在另一个字符串第一次出现的位置
$vendor = substr($class,0,strpos($class, '\\')); //顶级命名空间
$vendorDir = self::$vendorMap[$vendor]; // 文件基目录
$filePath = substr($class, strlen($vendor)) . '.php'; // 文件相对路径
return strtr($vendorDir . $filePath, '\\', DIRECTORY_SEPARATOR); // 文件标准路径
}
}
//test.php
define('ROOT_DIR',__DIR__);
require './namespace/Load.php';
spl_autoload_register('Load::autoload'); // 注册自动加载
$controller = new app\controllers\Index();
echo $controller->IndexAction();
作者:胡乱唱歌ing
链接:https://www.jianshu.com/p/ff0ad35509fa
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。