Autoincarcarea claselor PHP (AutoLoading)

postat acum 2 ani de Stefanescu Mihai in categorie iNoob

Una dintre principalele probleme intalnita in programare este structurarea aplicatiei si organizarea codului in asa fel incat aplicatia ta sa poata fi modificata usor (la o data ulterioara) si codul sa poata fi usor inteles de alti programatori (care probabil v-or lucra cu tine la proiect). Acest autoloading este important in mod special pentru aplicatiile pentru care dezvolti un oarecare framework. Bineinteles, exista o multime de framework-uri, de exemplu CodeIgniter si Laravel sunt doua framework-uri ce folosesc design pattern-ul Model View Controller (MVC). Daca ar trebuii sa ne construim singuri propriul framework ar trebuii sa gasim un mod de a incarca clasele necesare la cererea utilizatorilor. Autoincarcarea (autoloading-ul) este folositor  la incarcarea claselor pentru a nu le mai include in fiecare fisier.Hai sa presupunem ca toate link-urile duc catre index.php si in functie de link va fi creata o instanta a unei anumite clase. Probabil va ganditi ca puteti face ceva de genul acesta:

require_once('clase/clasa1.php');
require_once('clase/clasa2.php');
require_once('clase/clasa3.php');
require_once('clase/clasa4.php');
require_once('includes/functions.php');

Acest tip de “rezolvare” poate duce la anumite probleme. De exemplu, daca o clasa depinde de alta, sau daca clasele nu depinde una de alta, dar acest lucru se va schimba pe viitor aveti sanse destul de mari sa aveti probleme cu dependentele.Dar, folosirea unui autoloader va indeparta aceasta problema.

<?php
class clasaMea {
    public function __construct() {
        echo "Clasa Mea a fost instantiata...";
    }
}
?>

Sa presupunem ca avem clasa de mai sus pentru inceput. Acum hai sa scriem codul pentru un autoloader cat se poate de simplu:

<?php
function autoloaderulMeu($clasa) {
    $filename = "./". $clasa .".php";
    include_once($filename);
}

//Inregistram clasa in SPL
spl_autoload_register('autoloaderulMeu');

// acum apelam clasa
$obj = new clasaMea();
?>

Codul de mai sus va functiona fara probleme pentru ca, chiar daca nu am inclus fisierul cu clasa respectiva, acesta a fost inclus de autoloader.

Asta este tot pentru acest articol, desi ar trebuii sa mai mentionez i faptul ca incepand cu PHP 5.3 putem scrie un autoloader si cu ajutorul unei functii anonime:

spl_autoload_register(function ($clasa) {
    include 'clase/' . $clasa . '.class.php';
});

Intrebarile pot fi adresa mai jos, in sectiunea de comentarii sau in sectiunea dedicata special intrebarilor.

Sunt un tanar programator din Bucuresti ce lucreaza in PHP/Mysql (MySqli/PDO), Laravel, CodeIgniter, MySQL, PostgreSQL, Wordpress, HTML5/CSS3, Sass, Photoshop si multe altele.
Google+ Community Facebook Group
Acest articol a fost mutat de pe vechea platforma.
Pentru orice eroare aparuta la mutare va rog sa ma contactati!