2011-08-30 125 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?中写代替问号{...}'孩子从上面一层的命名空间继承。 –