97 Name space
I nomi di spazio sono percorsi al quale far puntare un file o una classe, in modo da poter avere più classi dello stesso nome all’interno dello stesso file.
Un esempio tipico è avere delle cartelle di più sviluppatori che creano una classe, la quale potrebbe avere lo stesso nome, usando i name space in php, potrò instanziare un oggetto mettendo il nome della classe preceduto dal suo namespace.
Supponiamo di avere una cartella Pippo con all’interno un file Test.php che contiene la classe Test
class Test { public $v; public function __construct() { $this->v = "ciao da ".__CLASS__; echo $this->v." "; } }
come prima regola di convenzione bisogna far coincidere il nome della classe col nome del file (Test.php coincide con la classe Test), questo può venire utile per gli autoload. Adesso inseriamo all’inizio del file il nome di spazio con la keyword namespace seguita dal nome che vogliamo assegnare al namespace :
namespace pappa; class Test { public $v; public function __construct() { $this->v = "ciao da ".__CLASS__; echo $this->v." "; } }
ora vogliamo richiamare la classe Test dentro a un file che sta sopra alla cartella Pippo/Test.php, diciamo un tipico file index.php (per fare un esempio). Per prima cosa dovremo includere il file Test.php
include_once 'pippo/Test.php';
Questo ci permette di incollare il contenuto del file Test.php dentro al file index.php, ora dobbiamo creare l’oggetto:
$prova = new Test();
Se mettessimo così riceveremmo un errore da php, perchè ora l’oggetto deve essere instaziato specificando il suo namespace, quindi la forma corretta è:
$prova = new pappa\Test();
Se avessimo più cartelle diverse con lo stesso nome di files e la stessa classe, instanzieremo oggetti con lo stesso nome di classe, ma diversi namespace.
Nello stesso files è possibile includere più name space, mettendo tra graffe le classi che si riferiscono a quel namespace, ma è una pratica meno diffusa che potrebbe portare ad errori.
Per richiamare o importare una classe o un’interfaccia all’interno di un altro file si scrive la keyword use seguita dal namespace della classe.
use pappa\Test