詳解spl_autoload_register()函式

lankecms發表於2014-09-25

在瞭解這個函式之前先來看另一個函式:__autoload。  

一、__autoload  

這是一個自動載入函式,在PHP5中,當我們例項化一個未定義的類時,就會觸發此函式。看下面例子:  

printit.class.php 
 
<?php 
 
class PRINTIT { 
 
 function doPrint() {
  echo 'hello world';
 }
}
?> 
 
index.php 
 
<?
function __autoload( $class ) {
 $file $class '.class.php';  
 if is_file($file) ) {  
  require_once($file);  
 }
 
$obj new PRINTIT();
$obj->doPrint();
?>

  

執行index.php後正常輸出hello world。在index.php中,由於沒有包含printit.class.php,在例項化printit時,自動呼叫__autoload函式,引數$class的值即為類名printit,此時printit.class.php就被引進來了。  

在物件導向中這種方法經常使用,可以避免書寫過多的引用檔案,同時也使整個系統更加靈活。  

二、spl_autoload_register()  

再看spl_autoload_register(),這個函式與__autoload有與曲同工之妙,看個簡單的例子:  

  
 
<?
function loadprint( $class ) {
 $file $class '.class.php';  
 if (is_file($file)) {  
  require_once($file);  
 
 
spl_autoload_register( 'loadprint' ); 
 
$obj new PRINTIT();
$obj->doPrint();
?>

將__autoload換成loadprint函式。但是loadprint不會像__autoload自動觸發,這時spl_autoload_register()就起作用了,它告訴PHP碰到沒有定義的類就執行loadprint()。 

spl_autoload_register() 呼叫靜態方法 

  
 
<? 
 
class test {
 public static function loadprint( $class ) {
  $file $class '.class.php';  
  if (is_file($file)) {  
   require_once($file);  
  
 }
 
spl_autoload_register(  array('test','loadprint')  );
//另一種寫法:spl_autoload_register(  "test::loadprint"  ); 
 
$obj new PRINTIT();
$obj->doPrint();
?>

轉:http://pingzhao1990.blog.163.com/blog/static/11356634220126219184282/

相關文章