2013-03-28 86 views
5

我在執行PHP命名空間相當混亂,尤其是當它涉及到別名 - 導入類。PHP名稱空間自動加載必須使用文件夾嗎?

我按照本教程教程:

但我不明白 - 當使用__autoload ,爲什麼我必須將別名類存儲在文件夾中,但是當__autoload而不是使用時,名稱空間中的別名就好了,如下所示,

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

雖然這個我會得到錯誤,如果我沒有在文件夾中存儲Conan.phpbarbarian

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

錯誤消息,

警告:要求(野蠻人/柯南。 php):無法打開流:沒有這樣的 文件或目錄在C:\ wamp \ www \ test \ 2013 \ php \ namepsace \ autoload.php on line 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; 
} 
?> 

它是一個必須存儲在文件夾中的別名類?當使用autoload時,是否可以導入類而不將它們存儲在文件夾中?

回答

8

與命名空間自動加載的類意味着它必須遵循的約定,通常該公約涉及使用文件夾(compare with PSR-0)。

如果您有類有時遵循該約定,那麼自動裝帶器如何知道何時使用文件夾?

因此,最終,是的類應根據其名稱空間存儲在文件夾中。如果您認爲文件夾結構沒有意義,那麼您應該更改名稱空間和文件夾結構以反映您真正想要的內容。

+0

感謝您的回答。現在我明白自動加載和別名文件夾的重要性。 – laukok

3

您不必使用的目錄,如果你不希望 - 這個例子呢,當然,但你可以實現你加載希望的任何方式。你可以把一個文件夾中的所有類,並使用形式Classes/Barbarian_Conan.php下劃線。然而,這可能會非常混亂,如果遇到類或名稱空間名稱中的下劃線,您必須制定該怎麼做!

這一切都表示,這是使用目錄的這樣一個好主意。此外,爲了與其他PHP軟件實現最大的互操作性,遵循PSR-0是個好主意。關於這個標準組的更多細節here

當我從網上發現,並從實驗發現,無論是類的名稱,也沒有命名空間的路徑名稱可以包含PHP保留字。

+1

謝謝。我應該去'目錄'。我的目錄名稱的問題是我有一個名爲'global'的目錄,它保留了全局類,'global'是一個保留在php中的關鍵字!我必須將這個目錄重命名爲其他的東西呢? – laukok

+1

據我所知,這將是罰款。據我所知,命名空間可以包含保留字[但類不能](http://stackoverflow.com/questions/11792070/php-reserved-words-as-namespaces-and-class-names)。編輯:你是對的,[見這裏](http://pornel.net/phpns)。 – halfer

+0

謝謝。我會檢查和測試。 – laukok

相關問題