Voglio diventare un guru php: Autocaricati!

Evviva le ferie, è mattino aria condizionata, nuovo ufficio, sole che batte sulle finestre un pomeriggio di mare che lo attende. Dovrà inventarsi un’altra “mega struttura” di sabbia da fare con suo figlio. Dopo la buca, il tunnel triplo e il vulcano ci vuole fantasia per inventarsi qualcosa di nuovo. Come in un moderno programma, caricherà i suoi oggetti, pale, scavatori, trivelle, secchielli e via a scavare tutto il pomeriggio. Il tutto intramezzato da una o più partite a calcio balilla.

Essere un allievo ha i suoi pro e contro. Un vero guru è un asceta, che non si mette di sicuro a far buche. Pensava questo mentre il giorno del colloquio con il maestro si avvicinava e gli argomenti da studiare erano tanti e complessi. Cosa avrebbe detto? Sarebbe stato sufficientemente pronto? Ecco allora che si tuffò in un argomento interessante e fondamentale. L’autoloading.  Come sempre iniziò a scrivere i suoi appunti.

“L’autoloading è descritto da due raccomandazioni PSR-0 e PRS-4. Il primo è dichiarato deprecato. Lo trattiamo perchè usato in alcuni framework. A margine delle note analizzerò l’autoloader di Magento 1 e di yii1 in contrapposizione all’autoloader di Magento2 e yii2.

Il psr-0 ha le seguenti specifiche OBBLIGATORIE:

  • Un namespace o una classe devono avere la seguente struttura : <Vendorname>\(<Namespace>\)*ClassName
  • Ciascun namespace deve avere un “top level namespace” il <VendorName>
  • Ogni namespace può avere tanti sub namespace quanti ne desidera
  • Ogni separatore di namespace è convertito in un separatore di directory quando viene caricata da file system
  • Ogni carattere _ nel nome della classe è trasformato in un separatore di directory. Class_Name si traduce in class/name (vedi magento1)
  • Alle classi viene aggiunto il suffisso php quando vengono chiamate dal file system
  • I caratteri nei nomi delle classi e dei namespace possono essere una combinazione di caratteri minuscoli o maiuscoli

Un esempio di implementazione dell’autoloader standard PSR-0

<?php

function autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

    require $fileName;
}
spl_autoload_register('autoload');

Questo gist è un esempio di autoloader che può caricare le classi che rispettano lo standard PSR-0.

Passiamo al presente. PSR-0 è stato marcato come deprecato il 21/10/2014. Al posto del PSR-0 è stato introdotto il PSR-4. Vediamo il dettaglio del nuovo standard:

  • Con il termine classe ci riferisce ad una classe, ad un interfaccia a un traits e simili
  • Una nome di classe ben specificato ha la seguente struttura : \<Namespacename>\<SubNameSpaceName>\<ClassName>
  • Un nome di classe ben strutturata deve avere un name space di primo livello anche noto come “vendor namespace”
  • Un nome di classe ben strutturato può avere uno o più sotto namespace
  • Un nome di classe ben strutturato deve avere un nome di classe che lo termina
  • Il nome della classe può contenere caratteri alfanumerici minuscoli o maiuscoli
  • Si deve far riferimento ad un nome di classe in modo  sensibile al minuscolo o maiuscolo (case sensitive)
  • Quando viene caricato un file impostato con un nome di classe ben strutturato
    • La concatenazione del vendor namespace con i sub namespace rappresentano la cosiddetta “base directory del file”.  (escluso il separatore)
    • i sub namespace contigui dopo il cosiddetto “namespace prefix”

      corrispondono ad una sotto directory all’interno di una ” directory di base ” , in cui i separatori di namespace rappresentano separatori di directory . Il nome della sotto directory deve corrispondere al caso dei nomi di sub – namespace .

    • Il nome della classe di terminazione corrisponde a un nome di file con estensione .php . Il nome del file deve corrispondere al caso del nome della classe di terminazione.

  • La classe che esegue l’autoloading non deve sollevare eccezioni, creare errori e non dovrebbe ritornare valori

Per completare alcuni esempi di implementazione dello standard PSR-4

Mentre era immerso nello studio degli standard, si accorse che fuori il sole era a picco, caldo e invitante. I suoi figli lo aspettavano per costruire castelli e strade di sabbia. Era tempo di staccare e liberare la mente. In fondo avrebbe seguito l’invito del maestro : “Libera la mente” …

 

Lascia un commento