【PHP】__autoload()魔术方法与spl_autoload_register
1、spl_autoload_register与autoload的区别详解
2、php.net 自动加载类
很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本开头写一个长长的包含文件列表(每个类一个文件)。
在 PHP 5 中,不再需要这样了。可以定义一个 __autoload() 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
简单的引入例子:
先新建一个类文件MyClass.class.php:
再在同目录下新建任意名字的php文件:
这里将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,以下是此函数的一些说明:
将函数注册到SPL __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。
如果需要多条 autoload 函数,spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。
在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种形式):
$cls - my_autoloader
"; require_once './MyClass1.class.php'; } class Loader{ public static function loadClass($cls){ echo "
$cls - Loader::loadClass
"; require_once './MyClass2.class.php'; } public static function nspClass($cls){ echo "
$cls - Loader::nspClass
"; 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', '$cls - anonymous function
"; 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
推荐阅读
-
PHP基于cookie与session统计网站访问量并输出显示的方法
-
php-extension - php_printer.dll中的create_font 方法,字体宽高单位与打印纸宽度的关系
-
php数组方法current与next的例子
-
植物大战僵尸修改器使用方法 PHP __autoload函数(自动载入类文件)的使用方法
-
分享在PHP 7下安装Swoole与Yar,Yaf的方法教程
-
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
-
php连接odbc数据源并保存与查询数据的方法
-
用Json实现PHP与JavaScript间数据交换的方法详解_PHP
-
php面向对象之构造函数作用与方法
-
php魔术方法和魔术变量