Szukaj…


Składnia

  • wymagać
  • spl_autoload_require

Uwagi

Automatyczne ładowanie, jako część strategii ramowej, zmniejsza ilość kodu, który musisz napisać.

Definicja klasy Inline, nie wymaga ładowania

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

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

PHP wie, co to jest Animal przed uruchomieniem new Animal , ponieważ PHP czyta pliki źródłowe od góry do dołu. Ale co, jeśli chcielibyśmy tworzyć nowe Zwierzęta w wielu miejscach, nie tylko w pliku źródłowym, w którym jest zdefiniowany? Aby to zrobić, musimy załadować definicję klasy.

Ręczne ładowanie klasy z wymaganiem

// 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');

Tutaj mamy trzy pliki. Jeden plik („Animal.php”) definiuje klasę. Ten plik nie ma żadnych skutków ubocznych poza zdefiniowaniem klasy i starannie utrzymuje całą wiedzę o „Zwierzęciu” w jednym miejscu. Łatwo jest kontrolować wersję. Można go łatwo wykorzystać ponownie.

Dwa pliki zużywają plik „Animal.php”, ręcznie require pliku. Ponownie PHP odczytuje pliki źródłowe od góry do dołu, więc wymaganie przechodzi do pliku „Animal.php” i udostępnia definicję klasy Animal przed wywołaniem new Animal .

Teraz wyobraź sobie, że mieliśmy dziesiątki lub setki przypadków, w których chcieliśmy wykonać new Animal . Wymagałoby to (celowo) wielu, wiele require instrukcji, które są bardzo uciążliwe dla kodu.

Automatyczne ładowanie zastępuje ręczne ładowanie definicji klasy

// 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');

Porównaj to z innymi przykładami. Zauważ, że require "Animal.php" został zastąpiony require "autoload.php" . Nadal dołączamy zewnętrzny plik w czasie wykonywania, ale zamiast dołączać konkretną definicję klasy, uwzględniamy logikę, która może obejmować dowolną klasę. Jest to poziom pośredni, który ułatwia nasz rozwój. Zamiast pisać jedno require dla każdej klasy, której potrzebujemy, piszemy jedno require dla wszystkich klas. Możemy zastąpić N require 1 require .

Magia dzieje się z spl_autoload_register . Ta funkcja PHP przyjmuje zamknięcie i dodaje zamknięcie do kolejki zamknięć. Gdy PHP napotyka klasę, dla której nie ma definicji, PHP przekazuje nazwę klasy każdemu zamknięciu w kolejce. Jeśli klasa istnieje po wywołaniu zamknięcia, PHP powraca do poprzedniej działalności. Jeśli klasa nie istnieje po wypróbowaniu całej kolejki, PHP ulega awarii, gdy „Class” Cokolwiek „nie znaleziono”.

Automatyczne ładowanie jako część rozwiązania ramowego

// 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');

Dzięki naszemu rodzajowemu autoloaderowi mamy dostęp do dowolnej klasy zgodnej z naszą konwencją nazewnictwa autoloaderów. W tym przykładzie nasza konwencja jest prosta: żądana klasa musi mieć plik w tym samym katalogu nazwanym dla klasy i kończącym się na „.php”. Zauważ, że nazwa klasy dokładnie odpowiada nazwie pliku.

Bez automatycznego ładowania musielibyśmy ręcznie require klas podstawowych. Gdybyśmy zbudowali całe zoo zwierząt, mielibyśmy tysiące żądań, które można by łatwiej zastąpić jednym autoloaderem.

W końcowej analizie automatyczne ładowanie PHP jest mechanizmem, który pomaga Ci pisać mniej kodu mechanicznego, dzięki czemu możesz skupić się na rozwiązywaniu problemów biznesowych. Wszystko, co musisz zrobić, to zdefiniować strategię, która odwzorowuje nazwę klasy na nazwę pliku . Możesz rzucić własną strategią automatycznego ładowania, tak jak tutaj. Możesz też użyć dowolnego ze standardowych, które przyjęła społeczność PHP: PSR-0 lub PSR-4 . Lub możesz użyć kompozytora do ogólnego zdefiniowania tych zależności i zarządzania nimi.

Automatyczne ładowanie za pomocą Composer

Kompozytor generuje plik vendor/autoload.php .

Możesz po prostu dołączyć ten plik, a otrzymasz automatyczne ładowanie za darmo.

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

Dzięki temu praca z zależnościami innych firm jest bardzo łatwa.


Możesz także dodać własny kod do Autoloadera, dodając sekcję autoload do pliku composer.json .

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

W tej sekcji definiujesz mapowania automatycznego ładowania. W tym przykładzie jest to odwzorowanie przestrzeni nazw na katalog PSR-4 : katalog /src znajduje się w folderze głównym projektów, na tym samym poziomie, co katalog /vendor . Przykładowa nazwa pliku to src/Foo.php zawierająca YourApplicationNamespace\Foo .

Ważne: Po dodaniu nowych wpisów do sekcji automatycznego ładowania należy ponownie uruchomić polecenie dump-autoload aby ponownie wygenerować i zaktualizować plik vendor/autoload.php o nowe informacje.

Oprócz automatycznego ładowania PSR-4 , Composer obsługuje również PSR-0 , classmap i automatyczne ładowanie files . Aby uzyskać więcej informacji, zobacz odniesienie do automatycznego ładowania .


Po /vendor/autoload.php pliku /vendor/autoload.php zwróci instancję programu Composer Autoloader. Możesz zapisać wartość zwracaną wywołania włączenia w zmiennej i dodać więcej przestrzeni nazw. Może to być przydatne na przykład do automatycznego ładowania klas w pakiecie testowym.

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow