2013-03-28 9 views
5

Jestem dość zdezorientowany w implementowaniu przestrzeni nazw w php, zwłaszcza jeśli chodzi o alias - importowanie klas.Czy automatyczne ładowanie nazw w PHP musi korzystać z folderów?

Mam po kursie z tego poradnika:

Ale nie rozumiem - gdy jest używany __autoload , dlaczego mam mieć do przechowywać klas aliasów w folderach, ale kiedy __autoload jest używany nie, alias w przestrzeni nazw jest w porządku, jak poniżej,

<?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); 
?> 

Mimo to będę się błąd, jeśli nie przechowywać Conan.php w folderze z barbarian

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

komunikat o błędzie,

Warning: require (barbarzyńca/Conana. php): nie udało się otworzyć strumienia: nie ma takiego pliku lub katalogu w katalogu C: \ wamp \ www \ test \ 2013 \ php \ namepsace \ autoload.php w linii 12

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; 
} 
?> 

Czy to koniecznością przechowywać klas alias w folderach? Czy możliwe jest zaimportowanie klas bez zapisywania ich w folderach, gdy używana jest funkcja autoload?

Odpowiedz

8

Automatyczne ładowanie klas z przestrzeniami nazw oznacza, że ​​musi być zgodna z konwencją, zwykle ta konwencja wymaga użycia folderów (compare with PSR-0).

Jeśli masz zajęcia, które czasami postępują zgodnie z tą konwencją, to w jaki sposób automatyczne ładowanie wie, kiedy używać folderów, czy nie?

Ostatecznie, tak klasy powinny być przechowywane w folderach zgodnie z ich przestrzeniami nazw. Jeśli uważasz, że struktura folderów nie ma sensu, powinieneś zmienić zarówno przestrzenie nazw, jak i strukturę folderów, aby odzwierciedlić to, czego naprawdę chcesz.

+0

dzięki za odpowiedź. Teraz rozumiem znaczenie folderów w automatycznym ładowaniu i aliasowaniu. – laukok

3

Nie musisz używać katalogów, jeśli nie chcesz - przykład ten oczywiście, ale możesz zaimplementować ładowanie w dowolny sposób. Możesz umieścić wszystkie klasy w jednym folderze i użyć znaków podkreślenia w postaci Classes/Barbarian_Conan.php. Jednak może to być dość niechlujne i trzeba będzie się zastanowić, co zrobić, jeśli napotkasz znak podkreślenia w nazwie klasy lub przestrzeni nazw!

To wszystko powiedziawszy, dobrze jest używać katalogów w ten sposób. Aby zapewnić maksymalną kompatybilność z innymi programami PHP, dobrze jest postępować zgodnie z PSR-0. Więcej szczegółów na temat tej grupy standardów here.

Jak odkryłem z internetu i odkryłeś z eksperymentu, ani nazwa klasy, ani nazwy ścieżek przestrzeni nazw nie mogą zawierać słowa zarezerwowanego dla PHP.

+1

Dzięki. Powinienem wybrać "katalogi". Problem z moją nazwą katalogu jest taki, że mam katalog o nazwie 'global', który utrzymuje klasy globalne, a' global' jest słowem kluczowym zarezerwowanym w php! Czy muszę zmienić nazwę tego katalogu na coś innego? – laukok

+1

O ile mi wiadomo, wszystko będzie dobrze. Przestrzenie nazw mogą zawierać słowa zastrzeżone, o ile wiem, [ale klasy nie mogą] (http://stackoverflow.com/questions/11792070/php-reserved-words-as-namespaces-and-class-names). Edytuj: miałeś rację, [patrz tutaj] (http://pornel.net/phpns). – halfer

+0

dziękuję. Sprawdzę i przetestuję. – laukok

Powiązane problemy