PHP AUTOLOAD, NAMESPACE

byeolhee·2022년 10월 5일

오토로드 AUTOLOAD

객체지향으로 프로그래밍을 하며 필연적으로 파일, CLASS등을 불러오기를 하게된다. 이때 CLASS등이 많아지면 INCLUDE하는 코드등도 많아지게 되는데 불러들일때 클래스 등을 자동으로 준비하게 한다. a파일에 include, require_once, include_once, require 등을 사용해서 b라는 파일을 불러왔을때 a+b 가 된 b파일이 되는것이다. a파일의 클래스 등 정의는 모두 b에 포함된다.

require_once "foo1".php; // 여러개 불러오게 됨
require_once "foo2".php;
require_once "foo3".php;
. . .

그런데 1개의 파일이 뿐만아니라 호출 빈도가 많아 이게 반복된다면? autoload 는 이런걸 해결하고 로드되는 파일의 번거로움을 없앨 수 있다. 그리고 spl_autoload_register로 대체될 수 있기때문에 spl_autoload_register를 사용하는것을 권장한다.
저것 하나로 class 를 손쉽게 사용할 수 있는것이다.

// __autoload의 역할 함수 등록하는 코드

spl_autoload_register(function($class){
	include 'classes/'.$class.'.php'; 
});

필요한 부분에 자동적으로 클래스를 인식해주는 기특한 녀석.
spl_autoload_register() 함수의 인자로 클래스의 이름을 받아 로드하는 익명함수를 제공해준다. 참고로 spl은 Standart PHP Library의 약자.

fileA.php

fumction firstWork($className) {
	include "first/" . $className . ".php";
} 
 
function secondWork($className) {
	include "second/" . $className . ".php";
}
 
spl_autoload_register("firstWork");
spl_autoload_register("secondWork");

네임스페이스

똑같은 함수명으로 함수를 사용하거나 하면 오류가 발생하는데 namespace와 use를 사용함으로서 비슷한 코드들을 사용할 수 있다. 함수도 마찬가지이다. 사용하는것이 방대해질 수록 네임스페이스의 중요성이 커진다.
패키지 매니저를 사용하거나 함수, 파일등을 이용할 때 특히나 그렇다. 클래스 같은 경우 이름이 겹치지 않게 해 함수나 다른요소에 적용할 수 있다.

단순히 말하자면 같은 이름의 클래스, 함수등을 하나의 프로그램 안에서 공존해서 잘 살수 있게 만드는게 핵심이다.

우선 사용할때 해당문서 최상단에 위치하는것이 좋고, 꼭 슬래시가 아닌 역슬래시'\'를 사용해야한다.

function printText(){}
function printText(){}
// 이런 경우 어떤 프린트텍스트 함수를 실행해야하나 알지 못하면서 우리 소중한 PHP가 고장 난다.

이렇게 해보면 쓸수 있다.

namespace printText;
function printText(){
	echo "첫번째".printText 함수;
}

namespace printText2
function printText(){
	echo "두번째".printText 함수;  
    //namespace에 printText2라고 선언한 것 아래에 적용됨.
}

아래는 널리 알려진 예제이다.

greeting_en.php

<?php
function welcome(){
    return 'Hello world';
}

greeting_ko.php

<?php
function welcome(){
    return '안녕세계';
}

main.php

<?php
require_once 'greeting_ko.php';
require_once 'greeting_en.php';
echo welcome();
echo welcome(); 

//웰컴이 두개!!! 어떤 웰컴을 불러와야되!!! 하면서 에러발생.
?>

두개가 겹치니 namespace를 이용 \를 이용한다.

greeting_lang.php

<?php
namespace language\en;
function welcome(){   //en의 welcom을 리턴
    return 'Hello world';
}
namespace language\ko;
function welcome(){  //ko의 welcom을 리턴
    return '안녕세계';
}
<?php
require_once 'greeting_lang.php';
echo language\ko\welcome();
echo language\en\welcome();
?>

네임스페이스를 사용하여 경로 등을 다르게 불러올 수 있다.
use 를 사용해서 네임스페이스를 짧게 사용할 수도 있다.
as를 이용해 이름을 변경해서 사용도 가능하다.

use 네임스페이스\클래스 as 변경이름;

예시

use language\en as lenEn;
use language\ko as lenKo;

 $enHello = new lenEn;
    echo $enHello->welcome(); //  Hello world
    

솔직히 기술문서는 1번 봐서는 모르겠다.
해보는게 제일 빠름
1번 보고 이해되면 내가 굉장히 부러운데... ㅠ
아무튼 한번 해보면 어떤건지 알게된다.
요즘 기술문서 보면 그냥 보기만 한거고 학습, 습득이 안되는 기분이다.
응용이 어려우니 실행해보고 좀 애먹고 기억하자.

profile
데이터 우주를 헤맵니다. 응답하라 데이터

0개의 댓글