이 기사의 예에서는 Zend Framework 튜토리얼의 자동 로딩 사용법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.
1. 개요
자동 로딩은 PHP 코드를 수동으로 작성할 필요가 없는 메커니즘입니다. » PHP 수동 자동 로딩을 참조하세요. 일단 오토로더가 정의되면 정의되지 않은 클래스나 인터페이스를 사용하려고 할 경우 자동으로 호출됩니다.
자동 로딩을 사용하면 프로젝트에서 클래스가 어디에 저장되어 있는지 걱정할 필요가 없습니다. 잘 정의된 오토로더를 사용하면 현재 클래스 파일을 기준으로 클래스 파일의 위치를 생각할 필요가 없습니다. 클래스를 사용하기만 하면 오토로더가 자동으로 파일을 찾습니다.
또한 자동 로딩을 통해 한 번만 로드되어 성능이 향상되므로 require_once() 대신 사용할 수 있습니다.
Zend Framework는 자동 로딩 사용을 권장하며 코드 라이브러리와 애플리케이션 코드를 자동으로 로드하는 다양한 도구를 제공합니다. 다음은 이러한 도구와 이를 효과적으로 사용하는 방법을 살펴보겠습니다.
자동 로딩 구현 규칙
클래스 명명 규칙
Zend Framework는 클래스 이름과 파일 시스템 간의 1:1 관계인 PEAR의 아이디어를 차용합니다. 간단히 말해서 디렉터리 구분 기호를 밑줄 문자("_")로 바꾸어 파일 경로를 나타내고 접미사 ".php"를 추가하면 됩니다. 예를 들어, "Foo_Bar_Baz" 클래스는 파일 시스템의 "Foo/Bar/Baz.php"에 해당합니다. 클래스의 위치가 PHP의 include_path를 통해 설정되었다고 가정하면, include_path에 설정된 경로를 기준으로 include() 및 require()를 통해 파일 이름을 찾을 수 있습니다.
또한 벤더명이나 프로젝트명을 접두사로 사용하는 것이 좋습니다. 이는 작성하는 모든 클래스에 공통 클래스 접두사가 있음을 의미합니다. 예를 들어 Zend Framework의 모든 코드에는 "Zend_"라는 접두사가 붙습니다. 이 명명 규칙은 명명 충돌을 방지하는 데 도움이 됩니다. ZendFramework에서는 "네임스페이스" 접두사를 자주 참조하므로 이를 PHP의 로컬 네임스페이스와 혼동하지 않도록 주의하십시오.
오토로더 디자인 규칙
Zend Framework는 주로 다음과 같은 목표와 디자인 요소를 제공하는 Zend_Loader_Autoloader를 통한 자동 로딩을 지원합니다.
네임스페이스 일치를 제공합니다. 클래스의 네임스페이스 접두사가 등록되지 않은 네임스페이스인 경우 FALSE가 반환됩니다.
자동 로더를 대체 자동 로더로 정의할 수 있습니다. 팀은 널리 분산되어 있거나 정의되지 않은 네임스페이스 접두사를 사용할 수 있으며, 이 경우 모든 네임스페이스 접두사와 일치하려고 시도합니다. 그러나 이 방법은 불필요한 조회가 발생할 수 있으므로 권장되지 않습니다.
오류 메시지 표시 억제를 허용합니다. 따라서 기본적으로 꺼져 있어야 합니다. 개발 단계에서 활성화할 수 있습니다.
자동 로딩을 맞춤 설정할 수 있습니다. 일부 개발자는 자동 로딩에 Zend_Loader::loadClass()를 사용하고 싶지 않지만 여전히 Zend Framework의 자동 로딩 메커니즘을 사용하고 싶어합니다. Zend_Loader_Autoloader를 사용하면 사용자 정의 자동 로딩을 사용할 수 있습니다.
SPL을 사용하여 콜백 체인을 자동으로 로드할 수 있습니다. 이것의 목적은 추가 자동 로더를 지정할 수 있도록 하는 것입니다.
2. 사용법:
일반적으로 필요한 사항을 포함 클래스에 도입한 다음 인스턴스화하기만 하면 됩니다. Zend_Loader_Autoloader가 채택한 싱글톤 모드로 인해 getInstance() 메서드를 사용하여 인스턴스를 얻을 수 있습니다.
require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance();
기본적으로 네임스페이스 접두사가 "Zend_" 또는 "ZendX_"인 모든 클래스를 로드할 수 있습니다. 단지 include_path가 지정되어 있는지 확인하세요.
다른 네임스페이스 접두사를 사용하고 싶으십니까? 가장 좋고 쉬운 방법은 RegisterNamespace() 메서드를 호출하는 것입니다. 단일 네임스페이스 접두사 또는 배열을 전달하여 이 작업을 수행할 수 있습니다.
require_once 'Zend/Loader/Autoloader.php'; $loader = Zend_Loader_Autoloader::getInstance(); $loader->registerNamespace('Foo_'); $loader->registerNamespace(array('Foo_', 'Bar_'));
또는 Zend_Loader_Autoloader를 "대체" 자동 로더로 사용할 수 있습니다. 즉, 정의 여부에 관계없이 네임스페이스가 정의되면 자동 로딩이 시도됩니다.
$loader->setFallbackAutoloader(true);
(참고: 이 방법은 권장되지 않습니다. 사용하지 마십시오.)
Zend_Loader_Autoloader의 내부 구현에서는 Zend_Loader::loadClass()를 사용하여 클래스를 로드합니다. 이 메소드는 include()를 사용하여 지정된 클래스 파일을 로드하려고 시도합니다. include()는 부울 값을 반환하거나 성공하지 못한 경우 FALSE를 반환하고 PHP 경고도 표시합니다. 다음 문제가 발생할 수 있습니다.
display_errors가 활성화되면 경고가 출력에 포함됩니다.
구성한 error_reporting 수준에 따라 로그에 출력될 수도 있습니다.
이러한 오류 메시지는 다음과 같이 표시되지 않을 수 있습니다. (그러나 display_errors가 활성화되면 오류 로그가 항상 표시됩니다.)
$autoloader->suppressNotFoundWarnings(true);
Zend 버전 선택 프레임워크
ZendFramework/
|-- 1.9.2/
|-- 라이브러리/
|-- ZendFramework-1.9.1-minimal/
| /
|-- 1.8.4PL1/
|-- library/
|-- 1.8.4/
|-- library/
|-- ZendFramework-1.8.3 /
| |-- 도서관/
|-- 1.7.8/
|-- 도서관/
|-- 1.7.7/
| >|- - 1.7.6/
|-- library/
$autoloader->setZfPath($path, 'latest');
$autoloader->setZfPath($path, '1.8');
$autoloader->setZfPath($path, '1.7.7');
[production] autoloaderZfPath = "path/to/ZendFramework" autoloaderZfVersion = "1.7.7" [qa] autoloaderZfVersion = "1.8" [development] autoloaderZfVersion = "latest"
然而,Zend Framework的命名空间和PHP 5.3的命名空间完全不同的。 Zend Framework中,提到的“命名空间”,是指一个类前缀。例如,所有的Zend Framework的类名称的前缀“Zend_”。 这是我们指定的“命名空间”。
在Zend Framework 2.0.0使用了原生的PHP命名空间。
自动加载器除了能够指定任意回调以外,Zend Framework还定义了一个需要自动加载类实现的接口Zend_Loader_Autoloader_Interface:
interface Zend_Loader_Autoloader_Interface { public function autoload($class); }
如果您希望在Zend Framework中使用自定义的自动加载器,可以使用 Zend_Loader_Autoloader的 pushAutoloader()和unshiftAutoloader()方法。
通过这些方法将在Zend Framework的内部自动装载器之后追加或之前使用自定义的加载器。
每个方法接受一个可选的第二个参数,类的命名空间前缀。自动加载器只查找给定的类前缀。如果不是指定的类前缀,将跳过自动加载器 , 这可能是一种性能改进方式。
当使用这个接口时,你需要传递类实例到Zend_Loader_Autoloader类的pushAutoloader()和unshiftAutoloader()方法,具体如下:
// Append function 'my_autoloader' to the stack, // to manage classes with the prefix 'My_': $loader->pushAutoloader('my_autoloader', 'My_'); // Prepend static method Foo_Loader::autoload() to the stack, // to manage classes with the prefix 'Foo_': $loader->unshiftAutoloader(array('Foo_Loader', 'autoload'), 'Foo_'); // Assume Foo_Autoloader implements Zend_Loader_Autoloader_Interface: $foo = new Foo_Autoloader(); $autoloader->pushAutoloader($foo, 'Foo_');
Zend_Loader_Autoloader的相关方法
希望本文所述对大家PHP程序设计有所帮助。
更多Zend Framework教程之Autoloading用法详解相关文章请关注PHP中文网!