2013-03-28 5 views
5

Ich bin ziemlich verwirrt bei der Implementierung von Namespace in PHP, vor allem, wenn es um Alias ​​- Importieren von Klassen kommt.Muss der PHP-Namespace-Autoloader Ordner verwenden?

Ich habe das Tutorial von diesem Tutorial gefolgt:

Aber ich verstehe nicht - wenn __autoload verwendet wird , warum ich muss die Alias-Klassen in Ordnern speichern, aber wenn __autoloadnicht verwendet wird, sind die Aliasnamen im Namespace einfach in Ordnung, wie folgt,

<?php 
namespace barbarian; 
class Conan { 
    var $bodyBuild = "extremely muscular"; 
    var $birthDate = 'before history'; 
    var $skill = 'fighting'; 
} 
namespace obrien; 
class Conan { 
    var $bodyBuild = "very skinny"; 
    var $birthDate = '1963'; 
    var $skill = 'comedy'; 
} 
use \barbarian\Conan as mother; 
$conan = new mother(); 
var_dump($conan); 
var_dump($conan->bodyBuild); 

$conan = new \obrien\Conan(); 
var_dump($conan); 
var_dump($conan->birthDate); 
?> 

Während dies werde ich Fehler bekommen, wenn ich nicht speichern Conan.php im Ordner von barbarian

<?php 
require_once "autoload.php"; 
use \barbarian\Conan as Cimmerian; 
$conan = new Cimmerian(); 
var_dump($conan); 
?> 

die Fehlermeldung,

Warning: require (Barbar/Conan. php): Fehler beim Öffnen des Streams: Keine solche Datei oder ein Verzeichnis in C: \ wamp \ www \ test \ 2013 \ php \ namespace \ autoload.php on line 12

Die autoload.php:

<?php 
function __autoload($classname) { 
    $classname = ltrim($classname, '\\'); 
    $filename = ''; 
    $namespace = ''; 
    if ($lastnspos = strripos($classname, '\\')) { 
    $namespace = substr($classname, 0, $lastnspos); 
    $classname = substr($classname, $lastnspos + 1); 
    $filename = str_replace('\\', '/', $namespace) . '/'; 
    } 
    $filename .= str_replace('_', '/', $classname) . '.php'; 
    require $filename; 
} 
?> 

Ist es ein Muss alias Klassen in Ordnern speichern? Ist es möglich, die Klassen zu importieren, ohne sie in Ordnern zu speichern, wenn autoload verwendet wird?

Antwort

8

Das automatische Laden von Klassen mit Namespaces bedeutet, dass es einer Konvention folgen muss. In der Regel umfasst die Konvention die Verwendung von Ordnern (compare with PSR-0).

Wenn Sie Klassen haben, die manchmal dieser Konvention folgen, wie würde dann der Autoloader wissen, wenn Ordner zu verwenden oder nicht?

Also letztlich ja Klassen sollten in Ordnern nach ihren Namespaces gespeichert werden. Wenn Sie der Meinung sind, dass die Ordnerstruktur nicht sinnvoll ist, sollten Sie sowohl die Namespaces als auch die Ordnerstruktur so ändern, dass sie Ihren Vorstellungen entsprechen.

+0

danke für die Antwort. Jetzt verstehe ich die Wichtigkeit von Ordnern beim Autoloading und Aliasing. – laukok

3

Sie müssen Verzeichnisse nicht verwenden, wenn Sie nicht möchten - das Beispiel natürlich, aber Sie können laden, wie Sie wollen. Sie könnten alle Klassen in einen einzigen Ordner stellen und Unterstriche im Formular Classes/Barbarian_Conan.php verwenden. Das könnte jedoch ziemlich unordentlich werden, und Sie müssten herausfinden, was zu tun ist, wenn Sie einen Unterstrich in einem Klassen- oder Namespace-Namen gefunden haben!

Das alles gesagt, ist es eine gute Idee, Verzeichnisse auf diese Weise zu verwenden. Für maximale Interoperabilität mit anderer PHP-Software ist es außerdem eine gute Idee, PSR-0 zu folgen. Weitere Details zu dieser Normengruppe here.

Wie ich aus dem Internet erfuhr, und Sie durch Experimente entdeckt haben, dürfen weder der Klassenname noch die Namespace-Pfadnamen ein PHP-reserviertes Wort enthalten.

+1

Danke. Ich sollte für "Verzeichnisse" gehen. Das Problem mit meinem Verzeichnisnamen ist, dass ich ein Verzeichnis namens 'global' habe, das globale Klassen enthält und' global' ein Schlüsselwort, das in PHP reserviert ist! Ich muss dieses Verzeichnis dann zu etwas anderem umbenennen? – laukok

+1

Soweit ich weiß, wird das gut. Namespaces können reservierte Wörter enthalten, soweit ich weiß, [aber Klassen können nicht] (http://stackoverflow.com/questions/11792070/php-reserved-words-as-namespaces-and-class-names). Edit: Du hattest Recht, [siehe hier] (http://pornel.net/phpns). – halfer

+0

danke. Ich werde prüfen und testen. – laukok