php spl_autoload_register()函數

在瞭解這個函數之前先來看另一個函數:__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();
?>
27
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章