2009-02-27 3 views
6

Ich habe die neueste PHP-Unterstützung für Namespaces gehört. Ich weiß, Variablen im globalen Geltungsbereich definiert haben keine Namespace, also wie macht man eine Variable in einem anderen Namensraum?Was ist ein Namespace und wie ist er in PHP implementiert?

Ist es nur eine Möglichkeit, Variablen/Funktionen zu kategorisieren?

Antwort

24

Namespaces sind ein Programmiersprachenmechanismus zum Organisieren von Variablen, Funktionen und Klassen. PHP 5.3 fügt Unterstützung für Namespaces, die ich im folgenden Beispiel demonstrieren werden:

Sagen Sie möchten, dass zwei Projekte kombinieren, die den gleichen Klassennamen Benutzer, verwenden aber unterschiedliche Implementierungen der einzelnen:

// Code for Project One (proj1.php) 
<?php 
    class User { 
    protected $userId; 
    public function getUserId() { 
     return $this->userId; 
    } 
    } 
    $user = new User; 
    echo $user->getUserId(); 
?> 

// Code for Project Two (proj2.php) 
<?php 
    class User { 
    public $user_id; 
    } 
    $user = new User; 
    echo $user->user_id; 
?> 

<?php 
    // Combine the two projects 
    require 'proj1.php'; 
    require 'proj2.php'; // Naming collision! 
    $myUser = new User; // Which class to use? 
?> 

Für Versionen von PHP weniger als 5.3, würden Sie sich die Mühe der Änderung den Klassennamen für alle Instanzen der Klasse Benutzer, die von einem der Projekte gehen müssen, um einen Namen Kollision zu verhindern:

<?php 
    class ProjectOne_User { 
    // ... 
    } 
    $user = new ProjectOne_User; // Code in Project One has to be changed too 
?> 

Für PHP-Versionen größer oder gleich 5,3, können Sie Namespaces verwenden, wenn Sie ein Projekt erstellen, indem Sie eine Namespace-Deklaration hinzu:

<?php 
    // Code for Project One (proj1.php) 
    namespace ProjectOne; 
    class User { 
    // ... 
    } 
    $user = new User; 
?> 

<?php 
    // Combine the two projects 
    require 'proj1.php'; 

    use ProjectOne as One; // Declare namespace to use 

    require 'proj2.php' // No collision! 

    $user = new \One\User; // State which version of User class to use (using fully qualified namespace) 

    echo $user->user_id; // Use ProjectOne implementation 
?> 

Für weitere Informationen:

+0

sehr gut illustriert, mit Kommentaren und Code. +1 –

+0

Einverstanden. Sehr gut gemacht. Ich wünschte nur, sie gingen mit einem anderen Trennzeichen zwischen Namespace und Klasse. :( –

+0

Mit dem ganzen Begrenzer Greifen: es wird völlig in Ordnung funktionieren, wenn Sie nur einzelne in Anführungszeichen Saiten verwenden, die ich für jeden String in PHP mit Ausnahme von Zeilenumbrüchen –

1

Namensräume oft mit Bibliotheken verwendet werden, die Fähigkeit hilft, den Bibliothekscode mit 1 Einzel Namespace zu verweisen andere nicht verprügeln, die bereits verwendet werden.

3

A namespace ermöglicht es Ihnen, Code zu organisieren und gibt Ihnen die Möglichkeit, Ihre Produkte zu verkapseln.

Sie können Namespaces als ein Dateisystem visualisieren, das Verzeichnisse verwendet, um zugehörige Dateien zu gruppieren.

Grundsätzlich bieten Namespaces Ihnen eine Möglichkeit, verwandte Klassen, Funktionen und Konstanten zu gruppieren.

Sie helfen auch, Namenskollisionen zwischen PHP-Klassen/Funktionen/Konstanten und zur Verbesserung der Lesbarkeit des Codes, die Vermeidung extralangen Klassennamen zu vermeiden.

Beispiel Namespace-Deklaration:

<?php 
namespace MyProject; 

const CONNECT_OK = 1; 
class Connection { /* ... */ } 
function connect() { /* ... */ } 

?> 
+0

Also für eine Reihe von String-Helferfunktionen, soll ich sie aus statischen Funktionen in einer Klasse erhalten und Namespace-String tun; Funktionsübereinstimmung() {} usw.? – alex

3

Namespaces lösen das Problem Kollisionen zu benennen, wenn Klassen und Funktionen aus Bibliotheken importieren.

Ohne Namespaces wird es fehlschlagen, wenn Sie zwei Bibliotheken einschließen, die zufällig eine Funktion/Klasse mit demselben Namen definieren (dh zwei Bibliotheken, die beide eine Klasse namens 'user' enthalten).

Ohne Namespace-Unterstützung in PHP, haben die meisten Bibliotheken unternommen, um ihre Funktion/Klassennamen mit etwas prefixing, die in einem Versuch, wahrscheinlich einzigartig sein, Namenskollisionen zu vermeiden. Das Problem ist, dass dies längere Funktions- oder Klassennamen erzeugt.

Das Beispiel here ist der Ausnahmeklasse:

PEAR_Form_Loader_Validate_Table_Element_Validator_Exception. 

Sie können als Alias ​​in Ihrem eigenen lokalen Bereich aus einem langen Namensraum importieren Sie die ‚AS‘ Schlüsselwort - ein Name, den Sie wählen. Daher können Sie in Ihrem lokalen Bereich immer noch einen kurzen Klassennamen Ihrer Wahl haben.

Im Folgenden wird ein 'Alias' namens DbConnection zu Zend :: DB :: Connection angewendet.

use Zend::DB::Connection as DbConnection