it-swarm.com.de

Was ist Autoloading? Wie benutzt man spl_autoload, __autoload und spl_autoload_register?

Ich lerne fortgeschrittene PHP Standards und versuche neue und nützliche Methoden zu implementieren. Früher habe ich __autoload nur um zu entkommen und mehrere Dateien auf jeder Seite einzuschließen, aber vor kurzem habe ich einen Tipp über __autoload manual

spl_autoload_register () bietet eine flexiblere Alternative für das automatische Laden von Klassen. Aus diesem Grund wird von der Verwendung von __ autoload () abgeraten und möglicherweise in Zukunft verworfen oder entfernt.

aber ich kann wirklich nicht herausfinden, wie man spl_autoload und spl_autoload_register

183
diEcho

spl_autoload_register() ermöglicht es Ihnen, mehrere Funktionen (oder statische Methoden aus Ihrer eigenen Autoload-Klasse) zu registrieren, die PHP in einen Stapel/eine Warteschlange stellen und nacheinander aufrufen, wenn eine "neue Klasse" wird deklariert.

Also zum Beispiel:

spl_autoload_register('myAutoloader');

function myAutoloader($className)
{
    $path = '/path/to/class/';

    include $path.$className.'.php';
}

//-------------------------------------

$myClass = new MyClass();

Im obigen Beispiel ist "MyClass" der Name der Klasse, die Sie instanziieren möchten. PHP übergibt diesen Namen als Zeichenfolge an spl_autoload_register() Nehmen Sie die Variable auf und verwenden Sie sie, um die entsprechende Klasse/Datei "einzuschließen". Folglich müssen Sie diese Klasse nicht speziell über eine include/require-Anweisung einschließen ...

Rufen Sie einfach die zu instanziierende Klasse wie im obigen Beispiel auf, und da Sie eine eigene Funktion (über spl_autoload_register()) registriert haben, die herausfindet, wo sich alle Ihre Klassen befinden, PHP benutzt diese Funktion.

Der Vorteil der Verwendung von spl_autoload_register() besteht darin, dass Sie im Gegensatz zu __autoload() nicht in jeder von Ihnen erstellten Datei eine Autoload-Funktion implementieren müssen. Mit spl_autoload_register() können Sie auch mehrere Autoload-Funktionen registrieren, um das Autoloading zu beschleunigen und es noch einfacher zu machen.

Beispiel:

spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');

class MyAutoloader
{
    public static function ClassLoader($className)
    {
         //your loading logic here
    }


    public static function LibraryLoader($className)
    {
         //your loading logic here
    }

In Bezug auf spl_autoload heißt es im Handbuch:

Diese Funktion soll als Standardimplementierung für __autoload() verwendet werden. Wenn nichts anderes angegeben ist und spl_autoload_register() ohne Parameter aufgerufen wird, werden diese Funktionen für jeden späteren Aufruf von __autoload() verwendet.

Wenn sich alle Ihre Dateien in einem einzigen Verzeichnis befinden und Ihre Anwendung nicht nur .php-Dateien, sondern auch benutzerdefinierte Konfigurationsdateien mit beispielsweise .inc-Erweiterungen verwendet, können Sie beispielsweise Ihr Verzeichnis mit allen Dateien hinzufügen Dateien zu PHPs Include-Pfad (über set_include_path()).
Und da Sie auch Ihre Konfigurationsdateien benötigen, würden Sie spl_autoload_extensions() verwenden, um die Erweiterungen aufzulisten, nach denen Sie suchen möchten PHP).

Beispiel:

set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();

Da spl_autoload die Standardimplementierung der __autoload() magic-Methode ist, ruft PHP) spl_autoload auf, wenn Sie versuchen, eine neue Klasse zu instanziieren.

Hoffe das hilft...

299
Brownbay

Seit PHP 5.3) können Sie spl_autoload_register() mit Namespaces verwenden. Dies bedeutet, dass Sie Ihr Projekt organisieren und Ihre PHP-Klassen automatisch laden können, ohne ein __autoload() Funktion.

Um dieses Verhalten zu demonstrieren, erstellen Sie einfach eine Datei mit dem Namen index.php:

<?php
spl_autoload_register();
var_dump(new Main\Application);

Erstellen Sie dann einen Ordner mit dem Namen Main direkt neben der Datei index.php. Erstellen Sie zum Schluss eine Datei namens Application.php in Main und fügen Sie den folgenden Code ein:

<?php namespace Main;
class Application{}
12
user1974206

Hier ist die Art, wie ich Autoload verwende. In diesem Beispiel möchte ich Klassen aus 3 verschiedenen Verzeichnissen laden.

function namespaceAutoload($rawClass){

$class = str_replace('\\', DIRECTORY_SEPARATOR, $rawClass);

$possiblePaths[] = '..\sys\class\file.php';
$possiblePaths[] = '..\sys\class\lib\file.php';
$possiblePaths[] = '..\sys\class\class.file.inc.php';

foreach ($possiblePaths as $templatePath) {
    $path = str_replace(["\\", "file"], [DIRECTORY_SEPARATOR, $class], $templatePath);
    if (file_exists($path)) {
        require_once "$path";
        break;
    }
} spl_autoload_register("namespaceAutoload"); 

Im angegebenen Beispiel sucht PHP nach dem Namespace\class in diesen drei Verzeichnissen, wobei diese drei verschiedenen Dateinamenformate verwendet werden.

0
Augusto Santana