Autoladdning av klasser

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Autoladda Klasser

Många utvecklare som skriver objektorienterade applikationer skapar en PHP-källfil per klassdefinition. En av de största irritationsmomenten är att behöva skriva en lång lista med nödvändiga inkluderingskommandon i början av varje skript (ett för varje klass).

Funktionen `spl_autoload_register()` registrerar ett obegränsat antal autoladdare, vilket möjliggör att klasser och gränssnitt automatiskt laddas om de för närvarande inte är definierade. Genom att registrera autoladdare ges PHP en sista chans att ladda klassen eller gränssnittet innan det misslyckas med ett fel.

Alla klassliknande konstruktioner kan autoladdas på samma sätt. Detta inkluderar klasser, gränssnitt, traits och uppräkningar.

Varning: Före PHP 8.0.0 var det möjligt att använda `__autoload()` för att autoladda klasser och gränssnitt. Dock är det ett mindre flexibelt alternativ till `spl_autoload_register()` och `__autoload()` är föråldrat från och med PHP 7.2.0 och borttaget från och med PHP 8.0.0.

Observera:

`spl_autoload_register()` kan anropas flera gånger för att registrera flera autoladdare. Att kasta ett undantag från en autoload-funktion kommer dock att avbryta den processen och inte tillåta att ytterligare autoload-funktioner körs. Av den anledningen är det starkt avrått att kasta undantag från en autoload-funktion.

Exempel #1 Autoload-exempel

Detta exempel försöker ladda klasserna `MyClass1` och `MyClass2` från filerna `MyClass1.php` respektive `MyClass2.php`.

<?php
spl_autoload_register(function ($class_name) {
    include $class_name . '.php';
});

$obj  = new MyClass1();
$obj2 = new MyClass2(); 
?>

Exempel #2 Autoload annat exempel

Detta exempel försöker ladda gränssnittet `ITest`.

<?php

spl_autoload_register(function ($name) {
    var_dump($name);
});

class Foo implements ITest {
}

/*
string(5) "ITest"

Fatal error: Interface 'ITest' not found in ...
*/
?>

Se även

Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.oop5.autoload.php
PHP
Språkreferens
Språkreferens#Klasser_och_Objekt