PHP에서 클래스를 사용하는 경우 require 또는 include를 통해 사용하기 전에 로드해야 하지만 로드 결정에 영향을 미치는 두 가지 문제가 있습니다.
PHP에서는 Autoload가 제공되어 파일을 포함하는 것이 편리하지만 자동 로드는 예상대로 모든 상황을 처리할 수 없습니다. 오늘은 며칠 전에 겪었던 자동 로드 관련 문제를 기록해 보겠습니다.
Autoload를 사용하는 이유
PHP에서 클래스를 사용할 때 require를 통해서든 include를 통해서든 사용하기 전에 먼저 로드해야 하는데 로딩에 영향을 미치는 두 가지 문제가 있습니다.
첫째는 이 클래스 파일이 어디에 저장되어 있는지 모르겠고, 둘째는 이 파일을 언제 사용해야 할지 모르겠습니다. 특히 프로젝트 파일이 많은 경우 각 파일의 시작 부분에 긴 require 문자열을 쓰는 것은 불가능합니다...
PHP5 이후에는 자동 로드를 통해 이 문제를 해결할 수 있습니다. 그리고 PHP5.1 이후에는 보다 완전한 로딩 메커니즘을 제공하기 위해 spl_autoload_register()도 제공됩니다.
PHP에서 자동 로드 기사를 읽은 후, 클래스가 new를 통해 인스턴스화되면 PHP는 정의된 자동 로드 함수를 통해 해당 파일을 로드합니다. 이 클래스 파일이 extends를 사용하는 경우 또는 구현에 필요한 경우. 다른 클래스 파일을 사용하기 위해 PHP는 자동 로드를 다시 실행하여 클래스 파일을 검색하고 로드합니다. 동일한 클래스 파일에 대해 두 개의 요청이 있는 경우 오류가 보고됩니다. 원본 기사의 작성자는 이 문제를 설명하기 위해 세 가지 흥미로운 예를 제공했으며, 여기에서 소스 코드를 다운로드하여 볼 수 있습니다.
일반적으로 로딩 시 해당 위치에서 파일을 찾는 문제를 해결하는 방법은 여러 가지가 있습니다. 가장 일반적으로 사용되는 것은 특정 명명 표준을 지정하는 것입니다.
Zend의 방법
zend는 가장 널리 사용되는 방법 중 하나인 파일 이름에 경로를 포함하는 방법을 권장합니다. 예를 들어 다음 예는 다음과 같습니다.
// Main.class
function autoload($class_name) {
$path = str_replace('_', DIRECTORY_SEPARATOR, $class_name)
require_once $path.'. php'
}
$temp = new Main_Super_Class(); 위의 예에서는 Main/Super/Class.php 파일이 사용됩니다. 이 방법의 단점은 다음과 같습니다. 인코딩 과정에서 코드 파일이 어디에 위치해야 하는지 명확히 알아야 하며,
클래스 이름에 파일 경로를 하드코딩하기 때문에 폴더 구조를 수정해야 할 경우 모든 클래스를 수동으로 수정해야 합니다. 이름.
'모두 포함' 방법개발 환경에 있고 속도에 크게 관심이 없다면 이 방법을 사용하는 것이 매우 편리합니다. 모든 클래스 파일을 하나 또는 여러 개의 특정 폴더에 배치한 다음 순회하여 찾아서 로드합니다.
예:
코드는 다음과 같습니다.
<?php $arr = array ( 'Project/Classes', 'Project/Classes/Children', 'Project/Interfaces' ); foreach($arr as $dir) { $dir_list = opendir($dir); while ($file = readdir($dir_list)) { $path = $dir.DIRECTORY_SEPARATOR.$file; if(in_array($file, array('.', '..')) || is_dir($path)) continue; if (strpos($file, ".class.php")) require_once $path; } } ?>
파일 및 위치 연결또 다른 방법은 클래스 파일을 해당 위치와 연결하는
// configuration.php array_of_associations = array( 'MainSuperClass' = 'C:/Main/Super/Class.php', 'MainPoorClass' = 'C:/blablabla/gy.php' );
호출되는 파일
코드는 다음과 같습니다.
<?php require 'autoload_generated.php'; function autoload($className) { global $autoload_list; require_once $autoload_list[$className]; } $x = new A(); ?>
물론 파일이 너무 많으면 관리하기 귀찮겠지만 어느 것을 클래스 이름에 위치를 하드코딩하는 것보다 낫나요?
물론 우리는 이 목록을 수동으로 유지하고 싶지 않으므로 이를 달성하기 위해 이 파일의 자동 생성을 사용할 수 있습니다. 원본 기사의 저자는 이러한 도구를 구현했습니다. 잘 생각해 보면 구현하기가 어렵지 않습니다. 원본 기사의 저자는 학습할 가치가 있는 작은 Autoload 프레임워크도 개발했습니다.
위 내용은 PHP 자동 로드 자동 로딩 사용 예 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!