2011-09-02 6 views
4

아래 코드는 자동로드 클래스로 가지고 있지만 clean 메서드는 작동하지 않고 항상 dirty 메서드로 돌아갑니다.PHP5 AutoLoader SPL_AutoLoad Fails

나는 spl_autoload를 잘못 사용하고 있습니까? 그렇다면 올바른 (더 나은) 방법은 무엇입니까? 이것은 비효율적입니까, 어떻게 개선 될 수 있습니까?

이 방법을 사용할 때 항상 하단과 같은 결과가 표시되며 어떤 경우에는 클래스를 찾지 못하지만 은 오류를 throw하지 않습니다. 표시 오류가 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에 대한 호출 생각합니다.

참고이 기능은

그래서, spl_autoload 호출 Foo_Bar.php를 찾을 수 없습니다 때 혼동, 그 찾고 클래스 이름을 해달라고 소문자 것이다 다음 php documentation의 의견에, 나는 this 발견 pegFacebook 또는 Facebookpegfacebook.php 또는 facebook.class.php이라는 파일 검색을 방금 시작합니다.

내가 당신이라면 Symfony의 UniversalClassLoader에서 훨씬 더 단순화 된 클래스 로딩 처리의 예를 살펴볼 것입니다. 특정 확장명을 사용하기 위해이 파일을 조정할 수도 있지만이 문제를 처리 할 수있는 새로운 방법을 찾는 것이 좋습니다.

+0

그건 정말 짜증나 ... 나는 그들이 그것을 바꿀 것을 바란다! –