2011-09-02 43 views
4

我將下面的代碼作爲autoload類,但是看起來clean方法根本無法正常工作,並且它總是回退到dirty方法。PHP5 AutoLoader SPL_AutoLoad失敗

我是否正確使用spl_autoload?如果是的話,什麼是正確的(更好的)方式?這是無效的,它怎麼能被改進?

雖然使用這種方法時我總是得到輸出,但在某些情況下,它只是找不到類,但不會引發任何錯誤我將顯示錯誤設置爲1並檢查了錯誤日誌,但完全缺失。

代碼被初始化爲

require "vendor/AutoLoader.class.php"; 
self::setGlobal("autoloader", AutoLoader::init()); 

和類如下:

public static $instance; 
private $_src=array('vendor/', 'lib/', ''); 
private $_sub=array('base/', ''); 
private $_ext=array('.php', 'class.php', 'lib.php'); 

/* initialize the autoloader class */ 
public static function init(){ 
    if(self::$instance==NULL){ 
     self::$instance=new self(); 
    } 
    return self::$instance; 
} 

/* put the custom functions in the autoload register when the class is initialized */ 
private function __construct(){ 
    spl_autoload_register(array($this, 'clean')); 
    spl_autoload_register(array($this, 'dirty')); 
} 

/* the clean method to autoload the class without any includes, works in most cases */ 
private function clean($class){ 
    $class=str_replace('_', '/', $class); 
    spl_autoload_extensions(implode(',', $this->_ext)); 
    foreach($this->_src as $resource){ 
     foreach($this->_sub as $sub){ 
     echo 'Trying to load ', $class, ' via ', __METHOD__, "()<br />"; 
     set_include_path(pegFramework::getGlobal("baseDir") . $resource.$sub); 
     spl_autoload($class); 
     if(class_exists($class)) { 
      echo 'Found and clean included '.$class.' in '.$resource.$sub."<br />"; 
      break 2; 
     } 
     } 
    } 
} 

/* the dirty method to autoload the class after including the php file containing the class */ 
private function dirty($class){ 
    global $docroot; 
    $class=str_replace('_', '/', $class); 
    foreach($this->_src as $resource){ 
     foreach($this->_ext as $ext){ 
      foreach($this->_sub as $sub){ 
      echo 'Trying to load ', $class, ' via ', __METHOD__, "()<br />"; 
      if(@include(pegFramework::getGlobal("baseDir") . $resource . $sub. $class . $ext)) { 
       echo 'Found and dirty included '.$class.' as '.$resource . $sub. $class . $ext."<br />"; 
       break 3; 
      } 
      } 
     } 
    } 
    spl_autoload($class); 
} 

Trying to load pegDatabase via pegAutoloader::clean() 
...snip... 
Trying to load pegDatabase via pegAutoloader::clean() 
Trying to load pegDatabase via pegAutoloader::dirty() 
Trying to load pegDatabase via pegAutoloader::dirty() 
Trying to load basepegDatabase via pegAutoloader::clean() 
...snip... 
Trying to load basepegDatabase via pegAutoloader::clean() 
Trying to load basepegDatabase via pegAutoloader::dirty() 
Found and dirty included basepegDatabase as vendor/base/basepegDatabase.php 
Found and dirty included pegDatabase as vendor/pegDatabase.php 
Trying to load pegRequest via pegAutoloader::clean() 
...snip... 
Trying to load pegRequest via pegAutoloader::clean() 
Trying to load pegRequest via pegAutoloader::dirty() 
Trying to load pegRequest via pegAutoloader::dirty() 
Found and dirty included pegRequest as vendor/pegRequest.php 
Trying to load pegFacebook via pegAutoloader::clean() 
...snip... 
Trying to load pegFacebook via pegAutoloader::clean() 
Trying to load pegFacebook via pegAutoloader::dirty() 
...snip... 
Trying to load pegFacebook via pegAutoloader::dirty() 
Trying to load Facebook via pegAutoloader::clean() 
Trying to load Facebook via pegAutoloader::clean() 
...snip... 
Trying to load Facebook via pegAutoloader::dirty() 
Trying to load Facebook via pegAutoloader::dirty() 
Trying to load Facebook via pegAutoloader::dirty() 
...snip... 
Trying to load Facebook via pegAutoloader::dirty() 
Trying to load Facebook via pegAutoloader::dirty() 
...snip... 
Trying to load Facebook via pegAutoloader::dirty() 

回答

2

我認爲這是在調用spl_autoload多數民衆贊成絆倒你。在php documentation的評論,我發現this

注意:此功能將小寫的類名的尋找,不要混淆,當它不能找到Foo_Bar.php

因此,調用spl_autoloadpegFacebookFacebook只是要觸發搜索名爲pegfacebook.phpfacebook.class.php的文件。

但是,如果我是你的話,我會在Symfony的UniversalClassLoader上看看更簡化的類加載處理示例。你可以調整它來使用特定的擴展名,但我至少會考慮尋找解決這個問題的新方法。

+0

這真的很煩人......我希望他們選擇改變它! –