문제

서버 측의 includ_path에는 '/usr/share/pear/'에서 배 디렉토리에 대한 참조가 있습니다. 내 응용 프로그램 내에 '/usr/share/pear/library/'에 거주하는 공통 라이브러리의 파일이 포함되어 있습니다. require_once 'library/file.php'.

최근에 SPL Autoloader를 사용하기 시작했는데 로더 기능에서 파일을 포함 할 논리를 결정해야했습니다. 이 작업을 수행하는 첫 번째 방법은 파일을 포함시키고 @ 그것이 실패할지 확인하기 위해, 예를 들어 @include 'library/file.php' 그러나 나는 주로 내가 많이 읽었 기 때문에 @ 나쁜 연습이기 때문에 나는 폭발함으로써 수동으로 일을하기로 결정했습니다. get_include_path 에 의해 PATH_SEPARATOR 그리고 디렉토리가 내가 원하는 것인지 확인한 다음 file_exists 그리고 그것을 포함합니다.

그렇게 :

function classLoader( $class ) {
    $paths = explode( PATH_SEPARATOR, get_include_path() );
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
    if ( file_exists( $file) == false ) 
    {
        $exists = false;
        foreach ( $paths as $path ) 
        {
            $tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php';
            if ( file_exists ( $tmp ) ) 
            {
            $exists = true;
            $file = $tmp;
            }
        }
        if ( !$exists ) { return false; }
    }
    include $file;
}

spl_autoload_register('classLoader');

내가 잘못된 길을 갔습니까? 방금 했어야 했어 @include 사업입니까 아니면 내가 올바른 방향으로 다소하고 있습니까?

도움이 되었습니까?

해결책

한 가지 Habari Project Autoloader 흥미로운 것은 메모리의 전체 클래스 파일 목록을 캐시하여 클래스가 요청 될 때마다 파일을 검색하지 않도록합니다.

본질적으로, 당신은 당신의 내부에 정적을 선언합니다 __autoload() 클래스에서 색인화 된 모든 클래스 파일의 배열이 보유되어있어로드 할 수 있습니다. 예를 들어, 코드는 dir 또는를 사용합니다 glob() 이 정적 배열을 생성하려면 :

$class_files = array(
  'user' => '/var/www/htdocs/system/classes/user.class.php',
);

그런 다음 단순히 포함합니다 $class_files[$class] 올바른 파일을 얻으려면. 새 클래스가 참조 될 때마다 목록을 생성하거나 특정 파일 이름을 검색하는 대신 한 번에 디스크에서 카탈로그를 가져 오기 때문에 이것은 훌륭하고 빠릅니다. (속도 차이가 얼마나 많은지 놀랄 것입니다.)

배열에서 클래스 이름이 키가 아닌 경우 사용자 정의 예외를 던지거나 스터브/모의 클래스를 생성하여 반환 할 수 있습니다. 또한 Habari System Autoloader를 확인하면 Habari가 구현되는 것을 알 수 있습니다. __static() 자동로드 된 클래스에서 정적 클래스의 생성자와 같습니다.

include_once() 피해야합니다 @ 파일을 포함 할 파일을 확인한 경우 운영자가 불필요합니다.

다른 팁

나는 개인적으로 사용하는 길을 간다

function autoload($class) {
    /* transform class name into filename ... */
    include $class;
}

@가 없어도 디버깅을 용이하게합니다 (오류가 종료/생산에 로그인)

PHP 개발자 목록에 대한 관련 토론에도 관심이있을 수도 있습니다. http://marc.info/?t=125787162200003&r=1&w=2

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top