2011-08-30 160 views
17

例1:PHP命名空間 - 升級?

命名空間Inori \測試;

類MainTest { }

例2:

命名空間Inori \測試\子測試;

class SubTest extends ???? {}

問題:是有辦法迅速升了一級的命名空間,以便分測驗可以延長MainTest?像"../MainTest"?或者我堅持與\Inori\Test\MainTest

+3

命名空間在PHP中不能嵌套:有每說沒有等級之分。每個名稱空間都是相互獨立聲明的,名稱空間之間沒有父子關係(尚未)。 'Foo \ Bar'是與'Foo \ Bar \ Baz'完全不同的命名空間。 – netcoder

+0

所以我遇到了這一點,並意識到我並不完全需要父命名空間,我可以做我需要從全局命名空間,但不知道如何到達那裏。事實證明,你需要做的就是使用反斜槓啓動命名空間,並且不會使用嵌套命名空間。因此,如果你在'Foo \ Bar'命名空間並且調用'new Baz \ Bat()',它將在'Foo \ Bar \ Baz \ Bat()'命名空間中。但是,如果您調用'new \ Baz \ Bat()',它將位於'Baz \ Bat()'命名空間中。 – TorranceScott

回答

19

不支持相對名稱空間。有一個請求,但它: https://bugs.php.net/bug.php?id=52504

如果你導入你的類在文件的頂部,它不應該是一筆交易。

namespace Inori\Test\SubTest; 
use Inori\Test\MainTest; 

class SubTest extends MainTest { } 
+0

'use'被稱爲別名/導入,可以通過5種方式使用:http://php.net/manual/en/language.namespaces.importing.php –

1

看到接受的答案已經提供。然而,在這裏你可以使用一個代碼來利用相關的命名空間(注意:在你的代碼中免費使用下面的代碼免費和引用作者是不需要的,作者不提供任何保證,並且代碼的使用是自己承擔風險的)。

更新:代碼可以在您的類中使用,通過相對命名空間動態快速地加載其他類。本主題的入門者正在尋找一種通過相對名稱空間將類擴展到其他類的方法,但這種方法仍然不適用於此代碼。

在你的類只需添加以下代碼:

public function TestRelativeNamespace() 
{ 
    // (e.g., param1 = site\lib\firm\package\foo, param2 = .\..\..\different) 
    $namespace = $this->GetFullNamespace(__NAMESPACE__, '.\\..\\..\\different'); 

    // will print namespace: site\lib\firm\different 
    print $namespace; 

    // to create object 
    $className = $namespace . '\\TestClass'; 
    $test = new $className(); 
} 

public function GetFullNamespace($currentNamespace, $relativeNamespace) 
{ 
    // correct relative namespace 
    $relativeNamespace = preg_replace('#/#Di', '\\', $relativeNamespace); 

    // create namespace parts 
    $namespaceParts = explode('\\', $currentNamespace); 

    // create parts for relative namespace 
    $relativeParts = explode('\\', $relativeNamespace); 

    $part; 
    for($i=0; $i<count($relativeParts); $i++) { 
     $part = $relativeParts[$i]; 

     // check if just a dot 
     if($part == '.') { 

      // just a dot - do nothing 
      continue; 
     } 
     // check if two dots 
     elseif($part == '..') { 

      // two dots - remove namespace part at end of the list 
      if(count($namespaceParts) > 0) { 

       // remove part at end of list 
       unset($namespaceParts[count($namespaceParts)-1]); 

       // update array-indexes 
       $namespaceParts = array_values($namespaceParts); 
      } 
     } 
     else { 

      // add namespace part 
      $namespaceParts[] = $part; 
     } 
    } 

    if(count($namespaceParts) > 0) { 
     return implode('\\', $namespaceParts); 
    } 
    else { 
     return ''; 
    } 

} 
+0

這對真正的問題並沒有幫助,在'class child extends?中寫代替問號{...}'孩子從上面一層的命名空間繼承。 –