2011-09-19 12 views
6

Co to jest odpowiednik instrukcji C# 's using Name.Space;, aby udostępnić wszystkie klasy tej przestrzeni nazw w bieżącym pliku? Czy to jest nawet możliwe w PHP?Przestrzenie nazw PHP: odpowiednik C# przy użyciu

Co chciałbym (ale nie działa):

<?php 
# myclass.php 
namespace Namespace; 
class myclass { 
} 
?> 

<?php 
# main.php 
include 'myclass.php' 
use Namespace; 

new myclass(); 
?> 

Odpowiedz

8

nie ma. W PHP interpreter nie będzie znał wszystkich klas, które prawdopodobnie mogą istnieć (szczególnie z powodu istnienia __autoload), więc czas działania może prowadzić do wielu konfliktów. Mając coś takiego:

use Foo\*; // Invalid code 
throw new Exception(); 

Może PL Foo \ wyjątek, który powinien być __autoload ed - PHP nie może wiedzieć.

Co można zrobić, to import sub-nazw:

use Foo\Bar; 
$o = new Bar\Baz(); // Is Foo\Bar\Baz 

lub pseudonim:

use Foo\Bar as B; 
$o = new B\Baz(); // Is Foo\Bar\Baz 
+0

powinno być możliwe tylko dla PHP autoload klasy, jeśli nie stwierdzono u wszystkich istniejących (i importowanych) nazw. Jeśli zaimportowałem przestrzeń nazw, każda klasa, która została poprawnie zdefiniowana (zawarta) z tą przestrzenią nazw, powinna być wywoływalna. – knittl

+0

Doprowadziłoby to do dużej liczby wywołań automatycznych, które musiałyby wywoływać autoloader dla każdej zaimportowanej przestrzeni nazw dla każdej przywoływanej nazwy klasy. Zakładając, że funkcja automatycznego ładowania jest względnie droga (patrząc na system plików), jest to dość godne uwagi. – johannes

+0

Nie wspominając już o tym, że mógłbym chcieć stworzyć klasę zawierającą pliki _terminowe wykonanie skryptu, a następnie włączyć je do użycia (mało prawdopodobny i prawdopodobnie niezbyt mądry scenariusz, ale mimo to PHP może to zrobić) – Mchl

0

Jak wyjaśniono Johannes lub można aliases twoje zajęcia

deklarację:

namespace myNamespace; 

class myClass { 
    public function __toString() 
    { 
     return "Hello world!"; 
    } 
} 

wykonanie:

include 'namespace.class.php'; 

use myNamespace\myClass as myClass; 

echo new myClass(); 
+1

Nie o to prosiłem. Wiem, że mogę zaimportować pojedyncze klasy (i aliasy), ale to nie jest mój problem. – knittl

+0

Och, przepraszam, wiem, że chcesz używać przestrzeni nazw jak w C# (ja też!), Ale jak wyjaśniono johannes to nie jest możliwe na teraz .. Chciałem współtworzyć z klasą aliasów raczej pod-przestrzenią nazw. – corretge

Powiązane problemy