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()

 

  1. //__autoload用法
  2. function __autoload($classname)
  3. {
  4. $filename = "./class/".$classname.".class.php";
  5. if (is_file($filename))
  6. {
  7. include $filename;
  8. }
  9. }
  10.  
  11. //spl_autoload_register用法
  12. spl_autoload_register(‘load_class‘);
  13.  
  14. function load_class($classname)
  15. {
  16. $filename = "./class/".$classname.".class.php";
  17. if (is_file($filename))
  18. {
  19. include $filename;
  20. }
  21. }


使用spl_autoload_register()的好处是不可言喻的:
(1)自动加载对象更加方便,很多框架都是这样做的:

  1. class ClassAutoloader {
  2. public function __construct() {
  3. spl_autoload_register(array($this, ‘loader‘));
  4. }
  5. private function loader($className) {
  6. echo ‘Trying to load ‘, $className, ‘ via ‘, __METHOD__, "()\n";
  7. include $className . ‘.php‘;
  8. }
  9. }
  10.  
  11. $autoloader = new ClassAutoloader();
  12.  
  13. $obj = new Class1();
  14. $obj = new Class2();


(2)你要知道__autoload()函数只能存在一次啊,spl_autoload_register()当然能注册多个函数

  1. function a () {
  2. include ‘a.php‘;
  3. }
  4. function b () {
  5. include ‘b.php‘;
  6. }
  7. spl_autoload_register(‘a‘);
  8. spl_autoload_register(‘b‘);


(3)SPL函数很丰富,提供了更多功能,如spl_autoload_unregister()注销已经注册的函数、spl_autoload_functions()返回所有已经注册的函数等。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。