개발 꿀팁/PHP

php 자동 로딩 메커니즘 구현

Jammie 2022. 7. 27. 16:49
반응형

1. 자동 로드란
자동 로딩은 우리가 있을 때 하는 거예요현재 파일에 존재하지 않는 클래스가 인스턴스화되었을 때, 자동 로딩 메커니즘을 호출하여 해당 클래스 파일을 불러옵니다.

비고: 자동 로드 두 가지 방법식(모두 php에 내장되어 있음), 하나는 __autoload()를 통해, 다른 하나는 spl_autol을 통해oad_register().

아래 두 가지 방식 소개 중모두 test3.php 파일을 실행한다.




2. __auto를 통해load() 자동 로드
/data/whwhwhkwk/test2/test2.php

<?php
 
class test2
{
 
    function aa()
    {
        echo 'this is function aa';
        echo "<br><br>";
    }
 
    static function bb()
    {
        echo 'this is function bb';
        echo "<br><br>";
    }
}

/data/www/test3.php

<?php
 
//로드 프로세스
//1、현재 파일에 test2 클래스가 없기 때문에 test2 클래스 인스턴스화,__autoload() 메서드가 자동으로 실행되고 클래스 이름이 자동으로 전송됩니다
//2、__autoload() 메서드를 실행하면 test2/test2.php 파일이 로드됩니다
//3、현재 파일은 __autoload() 방식으로 require 파일 test2.php에 입력되었으므로 test2.php에서 메소드를 호출할 수도 있습니다
 
$test = new test2();
$test->aa();//aa 메소드를 호출하다
test2::bb();//BB 정적 클래스 메서드 호출
 
function __autoload($class)
{
    echo '현재 자동으로 불러오는 클래스 이름'.$class."<br><br>";//이때$class 값이 test2입니다
 
    include_once __DIR__.'/test2/'.$class.'.php';//로딩한 셈이죠test2/test2.php
}

3. spl_autoload_register( )를 통한 자동 로딩 [추천 방식]
비고: __autoload() 자동 로딩 방식이 php 공식에 의해 폐기되었기 때문에 여기서 추출합니다.다른 방식의 spl_autoload_register로 구현된다.

여기서 test2.php 파일은 위와 같이 test3.php 파일만 바뀐다.



/data/whwhwh/test3.php

<?php
 
//로드 프로세스
//1、test2 클래스를 인스턴스화할 때 현재 파일에 test2 클래스가 없기 때문에 php에서 spl_autoload_register 자동 로딩 메커니즘을 호출합니다
//2、spl_autoload_register를 호출하면 우리가 정의한 autoload_test() 메서드가 호출됩니다
//3、게다가 상응하는 test2.php 파일을 도입했다
//4、해당 클래스 파일을 도입한 후에는 자연스럽게 클래스를 인스턴스화하고, 해당 메소드를 호출할 수 있게 된다
 
spl_autoload_register(autoload_test);
 
$test = new test2();
$test->aa();//aa 메소드를 호출하다
test2::bb();//BB 정적 클래스 메서드 호출
 
 
/**
 *자동 로딩에 사용
 * @param $class
 */
function autoload_test($class)
{
    echo '현재 자동으로 불러오는 클래스 이름'.$class."<br><br>";//이때,$class그 값이 뭐냐면요test2
 
    include_once __DIR__.'/test2/'.$class.'.php';//로딩한 셈이죠test2/test2.php
}

사. 총결산
spl_autoload_register( )와 __autoload( )의 장점은 다음과 같다.

(1) spl_autoload_register 로딩 함수를 필요에 따라 여러 번 쓸 수 있으며 로딩 순서는 누가 먼저 등록하고 누가 먼저 조정하는지 따른다.사용. __aotuload는 전역 함수이기 때문에 한 번만 정의할 수 있으며 유연하지 않습니다.

예를 들어 test2.php와 test4.class.php, _autolo를 동시에 로드해야 하기 때문에ad는 이 요구를 실현하지 못하고 spl_autoload_register를 이용하여 실현하는 것이 적당하다.

test4.class.php

<?php
 
class test4
{
 
    function dd()
    {
        echo "this is test4 function dd";
    }
 
}

 test3.php

<?php
 
//로드 프로세스
//1、test2 클래스를 인스턴스화할 때 현재 파일에 test2 클래스가 없기 때문에 php에서 spl_autoload_register 자동 로딩 메커니즘을 호출합니다
//2、spl_autoload_register를 호출하면 우리가 정의한 autoload_test() 메서드가 호출됩니다
//3、게다가 상응하는 test2.php 파일을 도입했다
//4、그런 다음 test4 클래스를 인스턴스화했습니다. test4 클래스는 현재 파일에도 없습니다. php가 spl_autoload_register 자동 로드 메커니즘을 자동으로 호출합니다
//4.1 첫 번째 등록 자동 로드 함수 spl_autoload_register(autoload_test)를 불러옵니다. 불러온 후 test4 클래스를 찾을 수 없습니다.
//4.2 그래서 php는 두 번째 자동 등록 함수 spl을 계속 불러올 거예요_autoload_register(autoload_test4)
//4.3 이때 드디어 test 4종을 찾았으니 더 이상 밑에서 찾을 필요가 없다고 말했다
//5、해당 클래스 파일을 도입한 후에는 자연스럽게 클래스를 인스턴스화하고, 해당 메소드를 호출할 수 있게 된다
 
spl_autoload_register(autoload_test);
spl_autoload_register(autoload_test4);
 
$test = new test2();
$test->aa();//aa 메소드를 호출하다
test2::bb();//BB 정적 클래스 메서드 호출
 
$test4 = new test4();
$test4->dd();
 
 
/**
 * 자동 로딩에 사용
 * @param $class
 */
function autoload_test($class)
{
    echo '현재 자동으로 불러오는 클래스 이름'.$class."<br><br>";//이때,$class그 값이 뭐냐면요test2
    include_once __DIR__.'/test2/'.$class.'.php';//로딩한 셈이죠test2/test2.php
}
 
function autoload_test4($class)
{
    echo '현재 자동으로 불러오는 클래스 이름'.$class."<br><br>";//이때,$class그 값이 뭐냐면요test4
    include_once __DIR__.'/'.$class.'.class.php';//로딩한 셈이죠test4.class.php
}

(2) spl_autoload_register( )는 catch할 수 있지만 __aotuload는 할 수 없습니다.

(3) spl_autoload_register에 등록된 로드 함수는 온디맨드 방식으로 spl_autoload_unre가 될 수 있습니다.지스터가 떨어지다

반응형