在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
参考链接: 1、spl_autoload_register与autoload的区别详解
简单的引入例子: 先新建一个类文件MyClass.class.php: <?php class MyClass { public function __construct() { echo "This is MyClass's construct"; } }
再在同目录下新建任意名字的php文件: <?php function __autoload($cls){ var_dump($cls); require './'.$cls.".class.php"; } $o1 = new MyClass(); // 这里不会再执行__autoload了,因为这个类已经require进来了。只有在当前文件中找不到该类的时候才会调用__autoload函数 $o2 = new MyClass(); 这里将require的内容放在了__autoload()中,如果没有定义这个函数,会报一个致命错误(Fatal),提示找不到MyClass类。 而定义了这个魔术方法会在new一个对象 且 在当前代码中找不到这个类定义的时候(满足以上2个条件),__autoload()函数被传入一个类名参数,并执行函数代码段。 所以,在函数中执行了var_dump("MyClass");和require './MyClass.class.php';
结果如下: string(7) "MyClass" This is MyClass's constructThis is MyClass's construct 这里输出了一次var_dump的内容和两次构造函数echo的内容。可以证明,当require进来之后,再次new MyClass这个类,并不会再次调用__autoload()函数。
autoload有缺点:不能重复定义(PHP语言的特点),导致如果要进行团队开发的时候很不方便,容易出现冲突。 于是PHP 5.1.2之后有一个autoload注册函数spl_autoload_register,以下是此函数的一些说明:
在PHP 5.3引入了命名空间之后,此函数的参数有多种形式: spl_autoload_register('my_autoloader'); // my_autoloader是一个函数名 spl_autoload_register(array('Loader', 'loadClass')); // 表示类内的静态方法,Loader::loadClass // 或者,自 PHP 5.3.0 起可以使用一个匿名函数 spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php'; }); spl_autoload_register(__NAMESPACE__ .'\Foo::test'); // 自 PHP 5.3.0 起,可以使用命名空间的形式
这个函数只需要在new对象之前调用即可。
以下是一个例子(测试以上4种形式): <?php // namespace Atl; // 加了这句话报错了! function my_autoloader($cls){ echo "<br/>$cls - my_autoloader <br/>"; require_once './MyClass1.class.php'; } class Loader{ public static function loadClass($cls){ echo "<br/>$cls - Loader::loadClass <br/>"; require_once './MyClass2.class.php'; } public static function nspClass($cls){ echo "<br/>$cls - Loader::nspClass <br/>"; require_once './MyClass3.class.php'; } } spl_autoload_register('my_autoloader'); $o1 = new MyClass1(); spl_autoload_register(array('Loader', 'loadClass')); $o2 = new MyClass2(); // 版本检测 if(version_compare(PHP_VERSION, '5.3.0', '<')) die("以下的两个测试需要PHP 5.3及以上"); spl_autoload_register(__NAMESPACE__ .'\Loader::nspClass'); $o3 = new MyClass3(); spl_autoload_register(function ($cls) { echo "<br/>$cls - anonymous function <br/>"; require_once './MyClass4.class.php'; }); $o4 = new MyClass4();
输出的结果如下(注意到查找的先后顺序与注册顺序相同): MyClass1 - my_autoloader This is MyClass1's construct MyClass2 - my_autoloader MyClass2 - Loader::loadClass This is MyClass2's construct MyClass3 - my_autoloader MyClass3 - Loader::loadClass MyClass3 - Loader::nspClass This is MyClass3's construct MyClass4 - my_autoloader MyClass4 - Loader::loadClass MyClass4 - Loader::nspClass MyClass4 - anonymous function This is MyClass4's construct
|
2022-07-18
2022-08-17
2022-11-06
2022-07-08
2022-08-17
请发表评论