2013-12-13 52 views
3

我有以下的命名空間結構與下面的類文件如何從父命名空間調用PHP類?

Application 
|->App.php 
|->Top 
    |->Start.php 
    |->Process.php 
    |->Child 
     |->Plugin.php 

所以在App.php我已經聲明

namespace Application; 
在Startp.php

在插件聲明

namespace Application\Top; 

.php宣稱爲

namespace Application\Top\Child; 

我看到,我可以從App.php調用Plugin.php類像

$object = new Top\Child\Plugin(); 

,如果它是一個孩子/孫子命名空間,但如果我想從Plugin.php調用Process.php什麼,這是來自分支的父命名空間?有沒有像雙點「..」來表示命名空間中的上級父目錄?我想打電話給像

File: Plugin.php 

$object = new ..\Process(); 

它不工作,它看起來像我只能從根開始一路像

$object = new \Application\Top\Process() 

這是唯一的選擇?謝謝!

+0

您是否嘗試過 「usings」:'使用應用程序\頂部;'然後調用'$對象=新的兒童\過程();' –

+0

@Saul謝謝你的答案,但我已經知道,我試圖找出是否有一個更簡短的方法來調用一個類,它位於子級別的父級別之上 – user702300

+0

我看到了。我從來沒有想過,哈哈。我習慣於將我的「使用」放在頂部,即使是上面的命名空間。 –

回答

5

正如它在這裏提到http://www.php.net/manual/en/language.namespaces.basics.php(在註釋中),只有一種方法來指定名稱空間 - 從根目錄。您不能使用.. \縮短命名空間調用。爲了縮短您調用的代碼,你可以使用

use \Application\Top\Process as SomeProcess; 

,並使用 $對象=新SomeProcess();

你也可以編寫你的類加載器。調用$ object = new .. \ Process();這裏是素描:

$classPath = explode("\\", __NAMESPACE__); 
array_pop($classPath); 
$newClassPath = implode("\\", $classPath) . '\'. 'Process'; 
$object = new $newClassPath(); 
+2

謝謝,實際上我已經閱讀了所有這些內容,只是讓我驚訝的是命名空間並不像我想的那樣靈活,所以只是爲了確認我是否還沒有錯過任何東西。 – user702300