CI4

[코드이그나이터] 네임 스페이스(namespace)

으누아빠 2020. 8. 27. 19:18
반응형

네임스페이스

출처:
https://opentutorials.org/course/3018/5138
https://www.lesstif.com/laravelprog/name-space-24445772.html

함수, 상수, 클래스 같은 것들의 이름을 의미함

그래서 같은 이름을 갖지고 있는 함수,상수,클래스의 충돌을 방지하기 위한 수단을 네임 스페이스 라고 한다.

네임스페이스의 정의

<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

네임스페이스는 최상단에 위치해야한다.

<html>
<?php
namespace MyProject; // fatal error - namespace must be the first statement in the script

하위 네임 스페이스 정의

네임스페이스는 계층구조로 지정할 수 있다.

<?php
namespace MyProject\Sub\Level;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

같은 파일내에서 다중 네임스페이스 정의

동일한 파일에서 여러 네임 스페이스를 선언가능

예제1: 여러 네임 스페이스 선언, 간단한 조합 구문

<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

namespace AnotherProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

예제2: 여러 네임 스페이스 선언, 대괄호 구문

<?php
namespace MyProject {

    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}

namespace AnotherProject {

    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}

예제3: 여러 네임 스페이스와 네임 스페이스가없는 코드 선언

<?php
namespace MyProject {
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}

namespace { // global code
    session_start();
    $a = MyProject\connect();
    echo MyProject\Connection::start();
}

use

사용할 때마다 전체 네임스페이스를 기술하기 번거로울 경우 use 키워드를 사용

Book.php

<?php
namespace WikiBooks;

class Book
{
    public function show() {
        echo "wikibooks\n";
    }
}

Use.php

<?php
include "Book.php";

use WikiBooks\Book;
$b = new Book();

as 키워드를 사용하여 클래스에 별칭을 부여할 수 있음

<?php
include "Book.php";

use WikiBooks\Book as MyBook;
$b = new MyBook();

현재 네임스페이스보다 상위에 있는 클래스를 사용하려면 다음과 같이 네임스페이스 앞에 슬래시를 붙여주면 전역 네임스페이스에서 클래스를 찾음

<?php
namespace WikiBooks;

use \FileLog\Logger;

class Book
{
    public function show() {
        echo "wikibooks\n";
        // 정상동작
        Logger.info("show function");
    }
}

참고

CI4 에서는 psr4 배열을 사용하면 네임스페이스를 해당 클래스가 있는 디렉토리에 매핑 할 수 있음

'/app' 와 '/system' 디렉토리는 사용의 편의성을 위해 미리 매핑이 되어 있음

Autoload.php

*   $psr4 = [
*       'CodeIgniter' => SYSTEMPATH,
*       'App'          => APPPATH
*   ];

CI4 에서는 namespace 를 반드시 디렉토리명 을 사용하여야 하며 대소문자는 구별 없음
해당 규칙을 지키지 않으면 에러가 발생