[composer] autoload

composer를 사용해서 간단하게 autoload를 사용하는 방법

1. monolog 패키지 설치해보기

composer require monolog/monolog

2. 패키지 로드하기

index.php

<?php
include './vendor/autoload.php';

use Monolog\Logger;

$log = new Logger('name');

3. 내 클래스 로드해보기

컴포저 autoload는 psr-4 규칙을 따르고 있기 때문에 클래스 생성시 네임스페이스를 규칙에 맞게 정하고 composer.json 파일에 namespace prefix와 클래스를 정의한 디렉토리를 매핑해주는 설정을 추가한다.

composer.json

{
    "require": {
        "monolog/monolog": "^2.2"
    },
    "autoload": {
        "psr-4": { // Js 네임페이스 접두사를 lib에 매핑
            "Js\\" : "lib/" 
        }
    }
}
/lib/src/Foo.php

<?php
namespace Js\Src;

class Foo{
    public function say()
    {
        return 'hello';
    }
}
index.php

<?php
include './vendor/autoload.php';

use Monolog\Logger;
use Js\Src\Foo;

$log = new Logger('name');
$foo = new Foo();
echo $foo->say();
composer dump-autoload

Foo 클래스에서 사용한 Js 네임스페이스 접두사를 lib디렉토리에 매핑해 주었기 때문에 autoload가 실행 될때 자동으로 지정한 경로의 클래스를 로드할 수 있게 된다.

참조

  • composer.json schema
  • psr-4
  • http://blog.ujsstudio.com/2021/01/09/psr-4-%eb%84%a4%ec%9e%84%ec%8a%a4%ed%8e%98%ec%9d%b4%ec%8a%a4-%ea%b7%9c%ec%b9%99/

psr-4 네임스페이스 규칙

  • “class” 라는 용어는 class, interface, trait 등의 기타 유사한 구조를 말한다
  • 정규화 된 클래스 이름의 형식
    • \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
    • 정규화 된 class 이름은 NamespaceName(공급자 네임스페이스) 라고하는 최상위 네임스페이스를 가져야한다. 회사명 아이디등 주로 사용한다. (MUST)
    • 정규화 된 class 이름은 하나 이상의 SubNamespaceNames를 가질 수 있다.(MAY)
    • 정규화 된 class 이름은 마지막 클래스 이름(terminating class name)을 가져야 한다.(MUST)
    • 밑줄(_)은 정규화 된 클래스 이름의 어느 부분에도 특별한 의미가 없다.
    • 정규화 된 클래스 이름의 알파벳 문자는 대소문자의 조합 일 수 있다 (MAY)
    • 모든 클래스 이름은 대소문자를 구분하여 참조해야한다.(MUST)
  • 정규화 된 class 이름에 해당하는 파일을 로드 할때
FULLY QUALIFIED CLASS NAMENAMESPACE PREFIXBASE DIRECTORYRESULTING FILE PATH
\Acme\Log\Writer\File_WriterAcme\Log\Writer./acme-log-writer/lib/./acme-log-writer/lib/File_Writer.php
\Aura\Web\Response\StatusAura\Web/path/to/aura-web/src//path/to/aura-web/src/Response/Status.php
\Symfony\Core\RequestSymfony\Core./vendor/Symfony/Core/./vendor/Symfony/Core/Request.php
\Zend\AclZend/usr/includes/Zend//usr/includes/Zend/Acl.php
네임스페이스 예제

  • 정규화 된 클래스 이름에서 선행 네임 스페이스 구분 기호(”)를 포함하지 않는 하나 이상의 상위 네임스페이스와 하위 네임스페이스로 구성된 (“namespace prefix”)는 적어도 하나의 base directory에 “대응”한다.
    Acme\Log\Writer : ./acme-log-writer/lib/
  • “Namespace prefix” 다음에 이어지는 하위 네임스페이스 이름은 “base directorty” 내의 하위 디렉토리에 해당하며 네임스페이스 구분 기호는 디렉토리 구분 기호를 나타낸다. 하위 디렉토리 이름은 하위 네임스페이스 이름의 대소문자와 일치해야 한다.
    \Aura\Web\Response\Status : /path/to/aura-web/src/Response/Status.php
  • 마지막에 존재하는 class이름은 .php 로 끝나는 파일 이름과 같아야 한다.
    \Aura\Web\Response\Status : /path/to/aura-web/src/Response/Status.php