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가 될 수 있습니다.지스터가 떨어지다
'개발 꿀팁 > PHP' 카테고리의 다른 글
우분투 20.04 php 5.6, nginx, mysql 환경 구축 과정 (0) | 2022.07.28 |
---|---|
PHP에서의 라우팅과 rewrite 사용 (0) | 2022.07.28 |
PHP 이미지를 데이터베이스에 업로드하여 표시 (0) | 2022.07.27 |
PHP 구현 큐 양방향 큐 (0) | 2022.07.27 |
Nginx가 Upstream을 사용하여 움직임 분리하기 (0) | 2022.07.27 |