[PHP] include & namespace

Dev_Honey·2022년 10월 9일
0

PHP

목록 보기
11/11
post-thumbnail

코드를 여러 개의 파일들로 분화시켜, 유지보수에 도움을 받을 수 있도록한다.
코드 분화는 다음과 같은 이점이 있다.
아마 모듈화의 의미와 비슷하다고 생각을 한다.

  • 자주 사용되는 코드를 별도의 파일로 만들어서 필요할 때마다 재활용할 수 있다.
  • 코드를 개선하면 이를 사용하고 있는 모든 애플리케이션의 동작이 개선된다.
  • 코드 수정 시에 필요한 로직을 빠르게 찾을 수 있다.
  • 필요한 로직만을 로드해서 메모리의 낭비를 줄일 수 있다.

include

  • PHP에서는 필요에 따라서 다른 PHP 파일을 코드 안으로 불러와서 사용한다.
    즉, 다른 언어에서는 만들어놓은 모듈을 import시키는 의미라고 볼 수 있다.
    include '파일명'은 외부의 php 파일을 로드할 때 사용
//greeting.php
<?php
function welcome(){
    return 'Hello world';
}
?>
//2.php
<?php
include 'greeting.php';
echo welcome();
?>

2.php 결과

PHP는 외부의 php 파일을 로드하는 방법으로 4가지 형식을 제공

  • include
  • include_once
  • require
  • require_once
    include와 require의 차이점은 존재하지 않는 파일의 로드를 시도했을 때 include가 warning를 일으킨다면 require는 fatal error를 일으킨다는 점이다. fatal error는 warning 보다 심각한 에러이기 때문에 require가 include 보다 엄격한 로드 방법이라고 할 수 있다.

_once라는 접미사가 붙은 것은 파일을 로드 할 때 단 한번만 로드하면 된다는 의미다.
once가 중요한 이유는 php 에플리케이션 간의 include를 하다보면 어디선가 중복의 include가 발생할 수 있는데, _once를 사용하면 그러한 중복을 방지한다.(한번 include된 php에플리케이션은 다시 load되지 않도록 강제한다.)


namespace

만약 php파일이 include통해 다른 php파일을 포함시킬 때, 클래스명, 함수의 이름, 변수명, 상수명이 만약 같다면 오류가 발생하는데 이를 해결하기 위한 것이 namespace !
네임스페이스란 간단하게 디렉토리와 같은 것이라고 생각하자. 하나의 에플리케이션에는 다양한 모듈을 사용하게 된다. 그런데 모듈이 서로 다른 개발자에 의해서 만들어지기 때문에 같은 이름을 쓰는 경우가 생길 수 있다. 이런 경우 먼저 로드된 모듈은 나중에 로드된 모듈에 의해서 덮어쓰기 되기 때문에 이에 대한 대책이 필요하다. 네임스페이스가 필요해지게 되는 것이다.
같은 이름을 정의하는 함수를 가진 php파일 2개

greeting_en.php
<?php
function welcome(){
    return 'Hello world';
}
greeting_kor.php
<?php
function welcome(){
    return '안녕세계';
}
//위 두 개를 require
<?php
require_once 'greeting_kor.php';
require_once 'greeting_en.php';
echo welcome();
echo welcome();
?>

결과

오류내용이 welcome()이라는 함수가 재선언될 수 없다고 한다.
왜냐하면 greeting_kor.php에서 welcome()이라는 이름을 가진 함수가 이미 선언되어 있기 때문에!

그래서 사용하는 것이 바로 namespace!!

//greeting_en_ns.php
<?php
namespace language\en;
function welcome(){
    return 'Hello world';
}
```php
//greeting_kor_ns.php
<?php
namespace language\kor;
function welcome(){
    return '안녕하세요';
}
// require로 php문서를 포함시켜보면,
<?php
require_once 'greeting_kor_ns.php';
require_once 'greeting_en_ns.php';
echo language\kor\welcome();
echo language\en\welcome();
?>


같은 이름의 welcome()함수가 다 실행이돼서 한글과 영어가 다 출력되는 것을 확인할 수 있다.
namespace를 호출하는 방법은 namespace명\함수이름; 으로 호출 할 수 있다.
namespace를 사용하는 방법에는 namespace 네임스페이스명; 그리고 아래에 클래스나 함수를 만들어주면 그 함수나 클래스이름은 지정한 네임스페이스명의 아래에 들어가게된다. 꼭, 위에서 말한 것처럼 같은 이름의 파일이 다른 디렉토리에 들어가는 것과 같이 되는 것이다.

namespace를 한 파일에서 한꺼번에 지정할 수도 있다.

<?php
namespace language\en;
function welcome(){
    return 'Hello world';
}
namespace language\kor;
function welcome(){
    return '안녕세계';
}
<?php
require_once 'greeting_lang.php';
echo language\kor\welcome();
echo language\en\welcome();
?>


과 같이 출력이 된다.

PHP use를 사용할 수 있다.

<?php 
namespace Coffee\Order;
class Espresso {
  public static function purchase($menu){
    echo "$menu 주문 완료 </br>";
  }
}
//namespace Coffee\Order\Espresso as Latte
use Coffee\Order\Espresso as Latte;
//namespace Coffee\Espresso
use Coffee\Order\Espresso as Americano;
Latte::purchase("바닐라 라떼");
Americano::purchase("아이스 아메리카노");
?>

결과


참조 및 출처

https://opentutorials.org/course/3018/5138 생활코딩 include&namespace

profile
자습서 같은 공부 블로그 만들기!

0개의 댓글