php spl_autoload_register 注册__autoload()函数 及其和autoload的对比
在越来越多的开源项目中,看到spl_autoload_register的使用,这是一个怎样的函数,它的优点是什么,下面对这个PHP 函数进行详细介绍。
spl_autoload_register介绍
查询PHP官网 http://php.net/manual/zh/function.spl-autoload-register.php 解释如下:
将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。
如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。因为 spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或spl_autoload_call()。
bool spl_autoload_register ([ callback $autoload_function
] ) 返回值是true和false。
autoload_function
-
欲注册的自动装载函数。如果没有提供任何参数,则自动注册autoload的默认实现函数spl_autoload()。 函数spl_autoload() 可看PHP官网http://php.net/manual/zh/function.spl-autoload.php
spl_autoload_register使用
举例介绍如何使用:
-
function loader($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
spl_autoload_register('loader');或者
class Loader
{
public static function loadClass($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
}
spl_autoload_register(array('Loader', 'loadClass'));spl_autoload_unregister介绍
可以相对于spl_autoload_register的反义理解
spl_autoload_unregister — 注销已注册的__autoload()函数
bool spl_autoload_unregister ( mixed$autoload_function
)从spl提供的自动装载函数栈中注销某一函数。如果该函数栈处于激活状态,并且在给定函数注销后该栈变为空,则该函数栈将会变为无效。
如果该函数注销后使得自动装载函数栈无效,即使存在有__autoload函数它也不会自动激活。
autoload_function
-
要注销的自动装载函数。
成功时返回
TRUE
, 或者在失败时返回FALSE
。PHP官网地址 http://php.net/manual/zh/function.spl-autoload-unregister.php
spl_autoload_register相比autoload的优点
关于spl_autoload_register()和__autoload()
- //__autoload用法
- function __autoload($classname)
- {
- $filename = "./class/".$classname.".class.php";
- if (is_file($filename))
- {
- include $filename;
- }
- }
- //spl_autoload_register用法
- spl_autoload_register('load_class');
- function load_class($classname)
- {
- $filename = "./class/".$classname.".class.php";
- if (is_file($filename))
- {
- include $filename;
- }
- }
使用spl_autoload_register()的好处是不可言喻的:
(1)自动加载对象更加方便,很多框架都是这样做的:- class ClassAutoloader {
- public function __construct() {
- spl_autoload_register(array($this, 'loader'));
- }
- private function loader($className) {
- echo 'Trying to load ', $className, ' via ', __METHOD__, "()\n";
- include $className . '.php';
- }
- }
- $autoloader = new ClassAutoloader();
- $obj = new Class1();
- $obj = new Class2();
(2)你要知道__autoload()函数只能存在一次啊,spl_autoload_register()当然能注册多个函数- function a () {
- include 'a.php';
- }
- function b () {
- include 'b.php';
- }
- spl_autoload_register('a');
- spl_autoload_register('b');
(3)SPL函数很丰富,提供了更多功能,如spl_autoload_unregister()注销已经注册的函数、spl_autoload_functions()返回所有已经注册的函数等。