2011-08-30 6 views
17

例1:PHP名前空間 - レベルを上げますか?

名前空間いのり\テスト。

クラスMainTest {}

例2:

名前空間祈り\テスト\サブテスト。

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

受け入れられた回答が既に表示されています。ただし、相対的な名前空間を利用するために使用できるコード(注:下記のコードを自由に使用してください。コード内での作成者への参照は必須ではなく、作成者によって保証されず、コードの使用自体が危険にさらされます)。

update:コードをクラス内で使用すると、相対的な名前空間を介して他のクラスを動的かつ迅速に読み込むことができます。このトピックの初心者は、相対的な名前空間を介してクラスを他のクラスに拡張する方法を探していますが、このコードでは不可能です。あなたのクラスで

はちょうど次のコードを追加します。

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 extends? 'の疑問符の代わりに書く{...} '子は1つ上のレベルの名前空間を継承します。 –