ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PHP - include와 namespace
    PHP 2018. 2. 9. 16:38

    Include

    PHP에서는 필요에 따라 다른 PHP파일을 코드 안으로 불러와서 사용할 수 있다.




    문법 - 

    greeting.php란 파일을 생성하고 해당 코드를 작성하자.

    1
    2
    3
    4
    5
    6
    <?php
    function welcome() {
      return "Hello world";
    }
     ?>
     
    cs


    1.php란 파일을 생성하고 해당 코드를 작성하자.

    1
    2
    3
    4
    5
    6
    7
    <?php
    include 'greeting.php';
     
    echo welcome();
     
     ?>
     
    cs


    그리고 브라우저를 통해 1.php로 접속해보면 에러가 발생하지 않고 Hello world문장이 출력되는 것을 알 수 있다.

    이렇듯 다른 파일의 코드를 현재 파일에 불러올 수가 있다.



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


    - include

    - include_once

    - require

    - require_once


    include와 require의 차이점은 존재하지 않는 파일의 로드를 시도했을 때, include가 warning을 일으킨다면 require는 fatal error를 일으킨다는 점이다.

    fatal error는 warning보다 심각한 에러이기 때문에 require가 include보다 엄격한 로드 방법이라고 할 수 있겠다.

    _once라는 접미사가 붙은 것은 파일을 로드할 때 단 한번만 로드하면 된다는 의미이다.





    namesapce

    네임스페이스란 디렉토리와 같은 것이라고 생각하면 이해하기 쉽다.

    하나의 애플리케이션에는 다양한 모듈을 사용하게 된다. 

    그런데 모듈이 서로 다른 개발자에 의해서 만들어지기 때문에 같은 이름을 쓰는 경우가 생길 수 있다. 

    이런 경우 먼저 로드된 모듈은 나중에 로드된 모듈에 의해서 덮어쓰기 되기 때문에 이에 대한 대책이 필요하다.

    따라서 각 모듈에 네임스페이스를 부여해 같은 이름의 함수라도 네임스페이스를 통해 서로 다른 기능의 함수라는 것을 알게 하는 것이다.




    예제 1 -

    hello_en.php란 파일을 생성하고 아래의 코드를 작성하자.

    1
    2
    3
    4
    5
    6
    <?php
    function welcome() {
      return "Hello world";
    }
     ?>
     
    cs


    hello_ko.php란 파일을 생성하고 아래의 코드를 작성하자.

    1
    2
    3
    4
    5
    6
    <?php
    function welcome() {
      return "안녕하세요";
    }
     ?>
     
    cs


    1.php란 파일을 생성하고 아래의 코드를 작성하자.

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    require_once 'hello_en.php';
    require_once 'hello_ko.php';
     
    echo welcome();
    echo welcome();
     ?>
     
    cs


    1.php에는 hello_en.php와 hello_ko.php 파일을 include했고 echo명령어를 통해 welcome()함수를 2번 호출하고 있다.


    이 후 브라우저로 1.php파일에 접속한다면 어떤 상황이 발생할까?



    접속을 해보면 Fatal error가 발생하게 될 것이다. 이유는 welcome()이란 함수를 재선언할 수 없다는 뜻이다.

    이렇듯 다른 파일을 불러왔지만 같은 명의 함수를 사용하는 경우에 오류를 피할 수가 없는 상황이 생기는 것이다.




    위의 상황을 해결할 수 있는 네임스페이스를 사용해보자.


    hello_en.php를 아래와 같이 수정한다.

    1
    2
    3
    4
    5
    6
    7
    <?php
    namespace language\en;
    function welcome() {
      return "Hello world";
    }
     ?>
     
    cs


    hello_ko.php를 아래와 같이 수정한다.

    1
    2
    3
    4
    5
    6
    7
    <?php
    namespace language\ko;
    function welcome() {
      return "안녕하세요";
    }
     ?>
     
    cs


    1.php를 아래와 같이 수정한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    require_once 'hello_en.php';
    require_once 'hello_ko.php';
     
    echo language\en\welcome();
    echo "<br />";
    echo language\ko\welcome();
     ?>
     
    cs


    각각의 언어 파일에 namespace가 지정되었다.

    1.php를 통해서 언어 파일을 include하고 호출할 때 namespace + 함수명을 적어주었다.

    1.php를 접속해보면 어떻게 될까?


    네임스페이스를 통해서 함수를 호출할 때에는 모듈을 호출할 대상이 정확하기 때문에 오류가 발생하지 않고 수행되는 것을 알 수가 있다.


    이렇듯 각기 다른 모듈간에 함수명이 겹치더라도 호출 시 네임스페이스를 작성해서 명확한 모듈을 호출한다면 에러가 발생하지 않는다.




    예제 2 -

    네임스페이스는 한 파일에 복수 등록 또한 가능하다.

    lang.php이란 파일을 생성하고 아래의 코드를 작성하자.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    namespace language\en;
    function welcome() {
      return "Hello world";
    }
     
    namespace language\ko;
    function welcome() {
      return "안녕하세요";
    }
     ?>
     
    cs


    2.php란 파일을 생성하고 아래의 코드를 작성하자.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    require_once 'lang.php';
     
    echo language\en\welcome();
    echo "<br />";
    echo language\ko\welcome();
     
     ?>
     
    cs


    lang.php파일에서 두개의 똑같은 명칭의 함수를 작성하였다.

    하지만 각각의 함수 위에 네임스페이스를 정의하면서 두 개의 함수가 각기 다른 함수라는 것을 명시했다.

    해당 파일을 include하고 사용할 때에는 이전의 방식과 동일하다. namesapce + 함수명을 통해서 호출할 수가 있다.


    'PHP' 카테고리의 다른 글

    PHP - 파일  (0) 2018.02.09
    PHP - Composer  (0) 2018.02.09
    PHP - 배열  (0) 2018.02.09
    PHP - 함수  (0) 2018.02.08
    PHP - 반복문 제어  (0) 2018.02.08
Designed by Tistory.