Förenkla PHP med autoload

När man bygger webbplatser i PHP är det ganska lätt att antalet klasser springer iväg. Använder du dig av “require” eller “include” för att inkludera dessa klasser kan det bli väldigt omständligt och rörigt.

Jag tänkte därför tips om en funktion som heter spl_autoload_register som gör att PHP kan själv ladda in de klasser som behövs. Det är väldigt enkelt och det behövs inte mycket kod för att åstadkomma detta.

Börja koda

Vi kommer i första delen av exemplet använda en index-fil, en mapp som innehåller en klass.

Bild 27

//Set the includepath
set_include_path(get_include_path().PATH_SEPARATOR."lib");
function autoload($class) {
	include $class.".php";
}
spl_autoload_register('autoload');

Här börjar vi alltså med att ställa sökvägen till inkluderingsmappen, i detta fall mappen “lib”. Vi skapar sedan en vanlig funktion vi kallar autoload som helt enkelt inkluderar den klass vi skapar. Slutligen använder vi funktionen spl_autoload_register och skickar med namnet på vår autoload-funktion.

Notera, för att detta ska fungera ska klassnamnet och filnamnet vara likadant, vilket ändå är en bra regel att använda sig efter.

I mappen “lib” skapar vi en testklass där filnamnet blir “Test.php” och klassnamnet blir alltså “Test”. Nu kan vi alltså skapa nya objekt/klasser och PHP kommer automatiskt att inkludera dessa när det behövs.

$test = new Test();

Använda undermappar och autoload

Som jag nämnde inledningsvis är autoload kanon när man har många klasser i sin applikation. Men att lägga alla klasser i mappen “lib” kan bli väldigt rörigt. Därför tänkte jag även visa ett exempel på hur man kan ha undermappar och ändå ladda in klasser automatiskt.

Vi börjar med att skapa undermappar i mappen “lib” och skapar sedan två nya klasser.

Bild 28

För att kunna ladda in klasser som ligger i undermappar måste vi förändra vår autoload-funktion en aning.

set_include_path(get_include_path().PATH_SEPARATOR."lib");
function autoload($class) {
	$class = str_replace('_', '/', $class);
	include $class.".php";
}
spl_autoload_register('autoload');

Det vi har lagt till nu är att vi använder str_replace för att byta ut “_” till “/”.

I och med denna metod måste vi döpa våra klasser på följande sätt “Mapp_Klassnamn”. Vill du läsa mer om standard för namngivning rekommenderar jag Zend’s standard.

Klassen Mailer kommer alltså sen ut enligt följande:

class Mail_Mailer
{
	public function __construct()
	{
		echo "Created a mailer object <br />";
	}
}

För att skapa ett nytt Mailer-objekt gör vi enligt följande.

$mailer = new Mail_Mailer();

Den här metoden med “Mapp_Namn” lämpar sig bra för PHP-versioner under 5.3 då stöd för Namespaces finns i 5.3.

Demo och källkod

Se demo eller ladda ner källkoden här.

6 thoughts on “Förenkla PHP med autoload

  1. Detta är ett måste när man börja jobba med flera klasser. Det går mkt snabbare och man minimera risken för fel. Zend Framework löser detta på ett underbart sätt. Zend ftw!

  2. Varför inte bara använda den “magiska” funktionen __autoload() (om man bara behöver en autoloadfunktion)? Då slipper man sätta spl_autoload_register(). Alltså:

  3. Min PHP-kod försvann i förra kommentaren:

    set_include_path(get_include_path().PATH_SEPARATOR.”lib”);
    function __autoload($class) {
    include $class.”.php”;
    }

  4. Jo det är ett annat alternativ, den största skillnaden och fördelen med spl_autoload är att du kan registrera flera autoload funktioner.


    spl_autoload_register('autoload');
    spl_autoload_register('autoload2');

    I praktiken innebär detta att om du använder flera bibliotek kan dessa bibliotek ha egna autoload-funktioner till skillnad mot __autoload där du kan endast ha en.

Din kommentar eller åsikt