SPL 자동로드 모범 사례
-
19-09-2019 - |
문제
서버 측의 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