아래 코드는 자동로드 클래스로 가지고 있지만 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()
그건 정말 짜증나 ... 나는 그들이 그것을 바꿀 것을 바란다! –