수색…


통사론

  • 요구하다
  • spl_autoload_require

비고

프레임 워크 전략의 일환으로 자동 로딩은 작성해야하는 상용구 코드의 양을 줄여줍니다.

인라인 클래스 정의,로드 필요 없음

// zoo.php
class Animal {
    public function eats($food) {
        echo "Yum, $food!";
    }
}

$animal = new Animal();
$animal->eats('meat');

PHP는 new Animal 실행하기 전에 Animal 이 무엇인지 알고 있습니다. 왜냐하면 PHP가 소스 파일을 위에서 아래로 읽으므로. 하지만 정의 된 소스 파일뿐만 아니라 여러 곳에서 새로운 동물을 만들고 싶다면 어떻게해야할까요? 이를 위해 클래스 정의를 로드 해야합니다.

요구에 의한 수동 클래스 로딩

// Animal.php
class Animal {
    public function eats($food) {
         echo "Yum, $food!";
    }
}

// zoo.php
require 'Animal.php';
$animal = new Animal;
$animal->eats('slop');

// aquarium.php
require 'Animal.php';
$animal = new Animal;
$animal->eats('shrimp');

여기에 세 개의 파일이 있습니다. 하나의 파일 ( "Animal.php")이 클래스를 정의합니다. 이 파일은 클래스를 정의하는 것 외에도 부작용이 없으며 한 곳에서 "동물"에 대한 모든 지식을 깔끔하게 유지합니다. 쉽게 버전 관리가 가능합니다. 쉽게 재사용 할 수 있습니다.

두 파일은 수동으로 파일을 require 하여 "Animal.php"파일을 사용합니다. 다시 PHP는 소스 파일을 위에서 아래로 읽습니다. 따라서 require는 "Animal.php"파일을 찾고 new Animal 호출하기 전에 Animal 클래스 정의를 사용할 수있게 만듭니다.

이제 우리가 new Animal 을 수행하고 싶었던 수십 또는 수백 가지 사례가 있다고 상상해보십시오. 그렇게하려면 코드 작성이 매우 지루한 많은 구문을 require 로합니다.

자동로드가 수동 클래스 정의 로딩을 대체합니다.

// autoload.php
spl_autoload_register(function ($class) {
    require_once "$class.php";
});

// Animal.php
class Animal {
    public function eats($food) {
         echo "Yum, $food!";
    }
}

// zoo.php
require 'autoload.php';
$animal = new Animal;
$animal->eats('slop');

// aquarium.php
require 'autoload.php';
$animal = new Animal;
$animal->eats('shrimp');

이것을 다른 예와 비교하십시오. 방법주의 사항 require "Animal.php" 로 대체 require "autoload.php" . 런타임에는 외부 파일을 포함하지만 특정 클래스 정의를 포함하는 대신 모든 클래스를 포함 수있는 논리를 포함 합니다 . 우리의 개발을 용이하게하는 간접적 인 수준입니다. 우리가 필요 require 하는 모든 클래스에 대해 하나씩 쓰는 대신 모든 클래스에 하나씩 require 합니다. 우리는 N require 를 1 require require 대체 할 수 있습니다.

마법은 spl_autoload_register 와 함께 발생합니다. 이 PHP 함수는 클로저를 사용하여 클로저를 클로저 에 추가합니다. PHP는 정의가없는 클래스를 만나면 클래스 이름을 큐의 각 클로저에 전달합니다. 클로저를 호출 한 후 클래스가 존재하면 PHP는 이전 비즈니스로 돌아갑니다. 전체 대기열을 시도한 후에 클래스가 존재하지 않으면 PHP는 "클래스 '가'찾을 수 없음 '으로 중단됩니다.

프레임 워크 솔루션의 일부로 자동 로딩

// autoload.php
spl_autoload_register(function ($class) {
    require_once "$class.php";
});

// Animal.php
class Animal {
    public function eats($food) {
         echo "Yum, $food!";
    }
}

// Ruminant.php
class Ruminant extends Animal {
    public function eats($food) {
        if ('grass' === $food) {
            parent::eats($food);
        } else {
            echo "Yuck, $food!";
        }
    }
}

// Cow.php
class Cow extends Ruminant {
}

// pasture.php
require 'autoload.php';
$animal = new Cow;
$animal->eats('grass');

일반 오토로더 덕분에 우리는 오토로더 명명 규칙을 따르는 모든 클래스에 액세스 할 수 있습니다. 이 예제에서 우리의 관습은 간단합니다. 원하는 클래스는 클래스와 동일한 디렉토리에 ".php"로 끝나는 파일을 가져야합니다. 클래스 이름이 파일 이름과 정확히 일치합니다.

자동 로딩 없이는 수동으로 기본 클래스를 require 할 것입니다. 우리가 동물원 전체를 만들었다면 수천 개의 요구 사항을 하나의 오토로더로 쉽게 대체 할 수 있습니다.

최종 분석에서 PHP 자동 로딩은 기계적인 코드를 적게 작성하여 비즈니스 문제를 해결하는 데 집중할 수있는 메커니즘입니다. 클래스 이름을 파일 이름에 매핑하는 전략을 정의하면됩니다 . 여기서 한 것처럼 자신의 자동 로딩 전략을 굴릴 수 있습니다. 또는 PHP 커뮤니티에서 채택한 표준 인터페이스 인 PSR-0 또는 PSR-4를 사용할 수 있습니다. 또는 작곡가 를 사용하여 이러한 종속성을 일반적으로 정의하고 관리 할 수 ​​있습니다.

Composer로 자동 로딩

작성기는 vendor/autoload.php 파일을 생성합니다.

이 파일을 포함 시키면 무료로 자동 로딩됩니다.

require __DIR__ . '/vendor/autoload.php';

따라서 타사 종속성 작업을 매우 쉽게 수행 할 수 있습니다.


composer.json 자동로드 섹션을 추가하여 오토 로더에 자신의 코드를 추가 할 수도 있습니다.

{
    "autoload": {
        "psr-4": {"YourApplicationNamespace\\": "src/"}
    }
}

이 섹션에서는 자동로드 매핑을 정의합니다. 이 예에서 네임 스페이스를 디렉토리에 매핑하는 PSR-4 : /src 디렉토리는 /vendor 디렉토리와 동일한 레벨에있는 프로젝트 루트 폴더에 있습니다. 예제 파일 이름은 YourApplicationNamespace\Foo 클래스가 포함 된 src/Foo.php 입니다.

중요 : autoload 섹션에 새 항목을 추가 한 후 dump-autoload 명령을 다시 실행하여 vendor/autoload.php 파일을 새 정보로 다시 생성하고 업데이트해야합니다.

PSR-4 자동 로딩 외에도 작곡가는 PSR-0 , classmapfiles 자동 로딩을 지원합니다. 자세한 정보는 자동로드 참조 를 참조하십시오.


/vendor/autoload.php 파일을 포함 시키면 Composer Autoloader의 인스턴스를 반환합니다. include 호출의 리턴 값을 변수에 저장하고 더 많은 네임 스페이스를 추가 할 수 있습니다. 예를 들어 테스트 스위트에서 클래스를 자동로드하는 데 유용 할 수 있습니다.

$loader = require __DIR__ . '/vendor/autoload.php';
$loader->add('Application\\Test\\', __DIR__);


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow