객체지향으로 프로그래밍을 하며 필연적으로 파일, 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번 보고 이해되면 내가 굉장히 부러운데... ㅠ
아무튼 한번 해보면 어떤건지 알게된다.
요즘 기술문서 보면 그냥 보기만 한거고 학습, 습득이 안되는 기분이다.
응용이 어려우니 실행해보고 좀 애먹고 기억하자.