Spații de nume în PHP
Un spațiu de nume oferă codului înrudit un nume comun. Împiedică clasele, interfețele, funcțiile și constantele să intre în conflict cu altele care au același nume.
Această protecție contează cu atât mai mult pe măsură ce codul tău crește sau când combini cod din mai multe surse.
De ce să folosim spații de nume?
- Previn conflictele de nume, care devin mai probabile în proiectele mai mari
- Îți împart codul în grupuri logice
- Îți țin codul separat de codul bibliotecilor
- Permit mai multor clase să aibă în siguranță același nume
Să zicem că un set de clase descrie un tabel HTML (Table, Row, Cell), iar alt set descrie mobilier (Table, Chair, Bed). Dacă pui fiecare set în propriul spațiu de nume, cele două clase Table nu vor fi confundate.
Declararea unui spațiu de nume
Un spațiu de nume se declară la începutul unui fișier PHP: scrie namespace, apoi numele pe care l-ai ales. Fragmentele de cod din această secțiune declară unul numit Html.
Notă: Poziția este strictă. Declarația trebuie să vină înaintea oricărui alt lucru din fișier, așa că un cod plasat înaintea ei este invalid.
Din acel punct, fiecare clasă, interfață, funcție și constantă declarată în fișier aparține spațiului de nume Html.
Poți, de asemenea, să imbrici spații de nume, pentru o organizare mai fină.
Exemplu
Aici, o clasă Table este creată în spațiul de nume Html:
Ieșire: script PHP
<?php
namespace Html;
class Table {
public $title = "";
public $rows = 0;
public function info() {
echo "<p>$this->title are $this->rows rânduri.</p>";
}
}
$table = new \Html\Table();
$table->title = "My table";
$table->rows = 5;
?>
<!DOCTYPE html>
<html>
<body>
<?php
$table->info();
?>
</body>
</html>
Declararea unui spațiu de nume
Pune cuvântul cheie namespace la începutul fișierului:
<?php
namespace Html;
?>
Declarație invalidă de spațiu de nume
Acest cod este invalid, deoarece alt cod vine înaintea declarației spațiului de nume:
<?php
echo "Hello World!";
namespace Html;
...
?>
Sintaxa spațiilor de nume imbricate
Aici, Html este imbricat într-un spațiu de nume numit Code:
<?php
namespace Code\Html;
?>
Folosirea spațiilor de nume
Tot codul de după declarația unui spațiu de nume rulează în acel spațiu de nume, așa că poate crea clasele lui folosind numele lor scurte, fără calificator. Codul din afara spațiului de nume trebuie să atașeze spațiul de nume la numele clasei.
Dacă lucrezi cu multe clase dintr-un singur spațiu de nume în același timp, cuvântul cheie namespace te scutește de scris:
Exemplu
Ca exemplul să poată rula, clasele sunt definite într-un bloc namespace Html { }, iar restul codului stă într-un bloc namespace { }, adică spațiul de nume global. De acolo, fiecare nume de clasă poartă prefixul Html\, iar get_class() afișează numele complet al clasei fiecărui obiect:
Ieșire: script PHP
<?php
namespace Html {
class Table {}
class Row {}
}
namespace {
$table = new Html\Table();
$row = new Html\Row();
echo get_class($table) . "\n";
echo get_class($row) . "\n";
}
?>
Exemplu
După declararea spațiului de nume Html, clasele definite în el nu mai au nevoie de calificatorul Html\. get_class() raportează în continuare numele lor complete:
Ieșire: script PHP
<?php
namespace Html;
class Table {}
class Row {}
$table = new Table();
$row = new Row();
echo get_class($table) . "\n";
echo get_class($row) . "\n";
?>
Alias pentru spațiu de nume
Un alias este un nume mai scurt pe care îl alegi pentru un spațiu de nume sau pentru o clasă și care face codul mai ușor de scris. Îl definești cu ajutorul cuvântului cheie use:
Exemplu
Aici, H devine un alias pentru spațiul de nume Html, așa că H\Table se referă la aceeași clasă ca Html\Table:
Ieșire: script PHP
<?php
namespace Html {
class Table {}
}
namespace {
use Html as H;
$table = new H\Table();
echo get_class($table) . "\n";
}
?>
Exemplu
Aici, T devine un alias pentru clasa Html\Table, așa că new T() creează un obiect Html\Table:
Ieșire: script PHP
<?php
namespace Html {
class Table {}
}
namespace {
use Html\Table as T;
$table = new T();
echo get_class($table) . "\n";
}
?>