[PHP] psr4

2019. 5. 13. 22:20·Language/PHP
반응형
psr4

php_logo

PHP5에 오토로딩 기능이 추가되었지만 라이브러리를 오토로딩하려면 직접 spl_autoload_register 메소드를 호출하여 일일이 등록해야 한다. 외부 라이브러리를 사용할 경우 일일이 이를 등록하는 것은 만만한 작업이 아니다.

PSR-4 는 PSR-0 을 대체하는 새로운 오토로딩 표준으로 다음과 같이 정규화된 클래스 이름(FQCN; Fully Qualified Class Name) 을 규정하고 있으며 이를 준수하여 패키지를 개발할 경우 패캐지 관리자인 컴포저를 통해 손쉽게 의존성 있는 모든 패키지를 로딩할 수 있다.

xxxxxxxxxx
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>

 

실습

테스트하려는 프로젝트 구조는 다음과 같다

proj
├── composer.json
├── index.php
└── src
    └── lib
        └── Worker.php

index.php에서 Worker.php를 호출할 것이다.

​x
# Worker.php
<?php
​
class Worker
{
    public function foo()
    {
        echo "Worker::foo()\n";
    }
}

 

index.php에서 Worker 클래스를 사용하기 위해서는 Worker.php 파일을 포함시켜야 한다.

xxxxxxxxxx
# index.php
<?php
​
require_once __DIR__ . "/src/lib/Worker.php";
​
$w = new Worker();
$w->work();

위처럼 require_oce를 이용하여 Worker.php 파일을 가져와 Worker 객체를 생성할 수 있다.

하지만 포함해야할 파일이 많아질수록 관리가 어려워진다.

xxxxxxxxxx
require_once __DIR__ . "/src/lib/Worker0.php";
require_once __DIR__ . "/src/lib/Worker1.php";
require_once __DIR__ . "/src/lib/Worker2.php";
...

모든 파일을 하나씩 포함시키기 위해 코드를 추가하다보면 관리하기 어렵고 오타로 인한 실수가 발생할 수 있다. autoload를 통해 단 한줄만 추가하여 편리하게 파일을 가져와 사용할 수 있다.

require_once 'vendor/autoload.php'

 

psr4 적용

Worker.php에 namespace를 추가한다.

xxxxxxxxxx
# Worker.php
<?php
​
#namespace 지정
namespace wor\lib;
​
class Worker
{
    public function foo()
    {
        echo "Worker::foo()\n";
    }
}

namespace는 클래스가 저장된 디렉토리와 일치해야한다.

그리고 composer를 실행하여 설정해줘야한다. composer 설치 방법은 이전 포스트에서 확인할 수 있다.

composer.json 수정

xxxxxxxxxx
{
    ...
    
    "autoload" : {
        "psr-4" : {
           "wor\\" : "src/"
        }
    }
   
    ....
}

wor\\lib\\Worker와 같이 클래스를 오토로딩할 때 wor\\ 네임스페이스의 전두사가 src/ 디렉터리에 대응되어있다면, 오토로더는 src/lib/Worker.php 파일을 찾을 것이고 그리고 해당 파일이 존재하면 이것을 불러올 것이다.

 

composer 실행

xxxxxxxxxx
$ composer dump-autoload

실행하면 다음과 같이 /vendor에 파일들이 추가된다.

xxxxxxxxxx
wor
├── composer.json
├── index.php
├── src
│   └── lib
│       └── Worker.php
# 생성된 내용들
└── vendor
    ├── autoload.php
    └── composer
        ├── autoload_classmap.php
        ├── autoload_namespaces.php
        ├── autoload_psr4.php
        ├── autoload_real.php
        ├── autoload_static.php
        ├── ClassLoader.php
        └── LICENSE

이렇게 해주고 vm에도 파일들을 다 업로드 해줘야 적용이 되었다.

 

이제 index.php에서 사용하려면 autoloader파일을 포함하고, 사용할 namespace를 지정해주면 된다.

xxxxxxxxxx
<?php
​
# 생성된 autoload.php를 포함한다.
require_once __DIR__ . "/vendor/autoload.php";
​
# Worker.php에서 지정한 namespace 사용
use wor\lib\Worker;
​
$w = new Worker();
$w->work();

Worker.php 파일을 정상적으로 읽어오는 것을 확인할 수 있다.

 

 

 

 

참고

반응형
저작자표시 비영리 변경금지 (새창열림)
'Language/PHP' 카테고리의 다른 글
  • [PHP] session
  • [PHP] require VS include
  • [PHP] composer 설치
  • [PHP] autoload
덴마크초코우유
덴마크초코우유
IT, 알고리즘, 프로그래밍 언어, 자료구조 등 정리
    반응형
  • 덴마크초코우유
    이것저것끄적
    덴마크초코우유
  • 전체
    오늘
    어제
    • 분류 전체보기 (123)
      • Spring Framework (10)
        • Spring (5)
        • JPA (3)
        • Spring Security (0)
      • Language (51)
        • Java (11)
        • Python (10)
        • JavaScript (5)
        • NUXT (2)
        • C C++ (15)
        • PHP (8)
      • DB (16)
        • MySQL (10)
        • Reids (3)
        • Memcached (2)
      • 개발 (3)
      • 프로젝트 (2)
      • Book (2)
      • PS (15)
        • 기타 (2)
        • 백준 (2)
        • 프로그래머스 (10)
      • 딥러닝 (8)
        • CUDA (0)
        • Pytorch (0)
        • 모델 (0)
        • 컴퓨터 비전 (4)
        • OpenCV (1)
      • 기타 (16)
        • 디자인패턴 (2)
        • UnrealEngine (8)
        • ubuntu (1)
        • node.js (1)
        • 블로그 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    프로그래머스
    Python
    mscoco
    redis
    게임 개발
    웹
    Unreal Engine
    자바
    C++
    php
    PS
    C
    클래스
    CPP
    JavaScript
    select
    map
    pytorch
    언리얼엔진4
    게임
    Unreal
    파이썬
    딥러닝
    FPS
    JS
    NUXT
    MySQL
    memcached
    블루프린트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
덴마크초코우유
[PHP] psr4
상단으로

티스토리툴바