>php教程 >php手册 >[PHP] __autoload() 매직 메소드 및 spl_autoload_register

[PHP] __autoload() 매직 메소드 및 spl_autoload_register

WBOY
WBOY원래의
2016-09-02 08:42:55990검색

참고링크:

1. spl_autoload_register와 autoload의 차이점에 대한 자세한 설명

2.php.net 자동 로딩 클래스

객체 지향 애플리케이션을 작성할 때 많은 개발자는 각 클래스 정의에 대해 PHP 소스 파일을 만듭니다. 각 스크립트의 시작 부분에 포함 파일의 긴 목록(클래스당 하나의 파일)을 작성해야 한다는 점은 큰 성가신 일입니다.

PHP 5에서는 더 이상 필요하지 않습니다. 아직 정의되지 않은 클래스를 사용하려고 할 때 자동으로 호출되는 __autoload() 함수를 정의할 수 있습니다. 이 함수를 호출하면 스크립팅 엔진은 PHP가 오류로 인해 실패하기 전에 필요한 클래스를 로드할 수 있는 마지막 기회를 갖게 됩니다.

간단한 가져오기 예:

먼저 새 클래스 파일 MyClass.class.php를 만듭니다.

<?php

class MyClass
{
    public function __construct()
    {
        echo "This is MyClass's construct";
    }

}

같은 디렉토리에 원하는 이름으로 새 PHP 파일을 만듭니다.

<?php

function __autoload($cls){
    var_dump($cls);
    require './'.$cls.".class.php";
}

$o1 = new MyClass();
// 这里不会再执行__autoload了,因为这个类已经require进来了。只有在当前文件中找不到该类的时候才会调用__autoload函数
$o2 = new MyClass();

여기서 필수 콘텐츠는 __autoload()에 배치됩니다. 이 함수가 정의되지 않으면 MyClass 클래스를 찾을 수 없음을 나타내는 치명적인 오류(Fatal)가 보고됩니다.

이 매직 메소드를 정의하면 새 객체가 발견되고 현재 코드에서 클래스 정의를 찾을 수 없는 경우(위의 두 조건이 충족됨) __autoload() 함수가 클래스 매개변수를 지정하고 함수 코드 세그먼트를 실행합니다.

따라서 var_dump("MyClass"); 및 require './MyClass.class.php';

가 함수에서 실행됩니다.

결과는 다음과 같습니다.

string(7) "MyClass" This is MyClass's constructThis is MyClass's construct

여기에는 var_dump의 내용이 1회, 생성자 echo의 내용이 2회 출력됩니다. require가 들어오고 new MyClass가 다시 생성되면 __autoload() 함수가 다시 호출되지 않는다는 것을 증명할 수 있습니다.

자동 로드에는 단점이 있습니다. 반복적으로 정의할 수 없기 때문에(PHP 언어의 특성) 팀 개발을 수행할 경우 불편하고 충돌이 발생하기 쉽습니다.

PHP 5.1.2 이후에는 자동 로드 등록 함수 spl_autoload_register가 있습니다. 다음은 이 함수에 대한 몇 가지 지침입니다.

SPL __autoload 함수 대기열에 함수를 등록합니다. 아직 활성화되지 않은 경우 이 대기열의 기능을 활성화하십시오.

여러 자동 로드 기능이 필요한 경우 spl_autoload_register()가 이러한 요구 사항을 충족합니다. 실제로 자동 로드 기능의 대기열을 생성하고 정의된 순서대로 하나씩 실행합니다. 반면 __autoload()는 한 번만 정의할 수 있습니다.

PHP 5.3에 네임스페이스가 도입된 이후 이 함수의 매개변수는 다양한 형태를 갖게 되었습니다.

spl_autoload_register('my_autoloader');    // my_autoloader是一个函数名

spl_autoload_register(array('Loader', 'loadClass'));  // 表示类内的静态方法,Loader::loadClass

// 或者,自 PHP 5.3.0 起可以使用一个匿名函数
spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.class.php';
});

spl_autoload_register(__NAMESPACE__ .'\Foo::test'); // 自 PHP 5.3.0 起,可以使用命名空间的形式

이 함수는 새 객체 이전에만 호출하면 됩니다.

다음은 예시입니다(위의 4가지 형식 테스트).

<?php

// namespace Atl;   // 加了这句话报错了!

function my_autoloader($cls){
    echo "<br/>$cls - my_autoloader <br/>";
    require_once './MyClass1.class.php';
}

class Loader{

    public static function loadClass($cls){
        echo "<br/>$cls - Loader::loadClass <br/>";
        require_once './MyClass2.class.php';
    }

    public static function nspClass($cls){
        echo "<br/>$cls - Loader::nspClass <br/>";
        require_once './MyClass3.class.php';
    }

}

spl_autoload_register('my_autoloader');

$o1 = new MyClass1();

spl_autoload_register(array('Loader', 'loadClass'));

$o2 = new MyClass2();

// 版本检测
if(version_compare(PHP_VERSION, '5.3.0', '<'))  die("以下的两个测试需要PHP 5.3及以上");

spl_autoload_register(__NAMESPACE__ .'\Loader::nspClass');
$o3 = new MyClass3();

spl_autoload_register(function ($cls) {
    echo "<br/>$cls - anonymous function <br/>";
    require_once './MyClass4.class.php';
});

$o4 = new MyClass4();

출력된 결과는 다음과 같습니다. (검색 순서는 등록 순서와 동일하니 참고하세요)

MyClass1 - my_autoloader 
This is MyClass1's construct
MyClass2 - my_autoloader 

MyClass2 - Loader::loadClass 
This is MyClass2's construct
MyClass3 - my_autoloader 

MyClass3 - Loader::loadClass 

MyClass3 - Loader::nspClass 
This is MyClass3's construct
MyClass4 - my_autoloader 

MyClass4 - Loader::loadClass 

MyClass4 - Loader::nspClass 

MyClass4 - anonymous function 
This is MyClass4's construct

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:인터페이스 호출다음 기사:인터페이스 호출