2012-04-09 8 views
1

私はクロージャを使ってクラスを再宣言する方法を見つけようとしています。これは今まで私が持っていたものです:動的ネームスペースを持つクラスの再宣言


私は、名前空間を除いて同じ2つの単純なクラスを持っています。 test2.phpの名前空間は "bla"と呼ばれ、new.phpでは "newname"と呼ばれます。それ以外は、まったく同じです。

namespace bla; //test2.php 
class A 
{ 
    public function __construct() 
    { } 

    public function bla() 
    { 
     echo '[A bla]'; 
    } 
} 

include ("new.php"); 
include ("test2.php"); 

use newname\A as A; // <-- dynamic 

$a = new A(); 
$a->bla(); 

ように、コードのこの部分は、単に「test2.php」に「new.php」クラスの代わりにクラスからメソッドを実行します。これは実際に私が必要なものです。しかし、私の問題はコードの最後の部分です。私はその行を変更する必要が声明「として使用」

$a = new bla\A(); //Defined in 'test2.php' 
$a->bla(); 

しかし、理由の:「A(のインフロント名前空間なしだから、

$a = new A(); //Defined in 'test2.php' 
$a->bla(); 

)通常、私は、名前空間を使用しただろう"

"bla \ A()"名前空間(test2.phpで定義されています)を保持する方法はありますか?それでも "new.php"からメソッドを呼び出していますか?この場合

+1

ところで、それに 'use'を持っていないすべてが閉鎖されます。クロージャーは、外部スコープから変数を共有する無名関数です。この場合の 'use'はエイリアスまたはインポートと呼ばれ、これらの行に沿って何かと呼ばれます:) – NikiC

+0

2つのクラスが同じ場合、なぜ2つのクラスが必要ですか? DRY http://en.wikipedia.org/wiki/Don%27t_repeat_yourself – GordonM

答えて

1

、各クラスから呼び出すには、=>

$bla = new bla/A(""); 
$bla->bla();  // to call from bla.php 

及び第二のクラス

$newname = new newname/A(""); 
$newname->something(); // to call from newname.php 

を書く必要がありますし、それが動作します、あなたが使用して過労スクリプトにする必要はありませんキーワード

また、so =>

のような名前空間でクラスを1つのファイルに書き込むことをお勧めします
+0

私はこのようにすることができると知っています。しかし、クラスを再宣言したい理由は、古いbla \ A()クラスに「パッチを当てたい」ためです。だから私はbla \ A()を呼び出すことができますが、newname \ A()からメソッドを実行する必要があります。この技術は猿のパッチングと呼ばれているので、これを行うことは可能です。どのように正確にはわからない。 – w00

+0

申し訳ありませんが、私はあなたが何をするつもりか質問を得ることができません:( – tnanoba

1

コメントで言われているように、それは "閉鎖"トピックではなく動的な名前空間トピックだけです。

私はあなたがキーワードuseを動的に使うことはできないと思います。 はしかし、PHPは、あなたは、メタプログラミングをしたいどのクラス動的に選択でき、動的言語である:

$wantedClass = 'myWantedNamespace\MyWantedClass'; 
$instance = new $wantedClass(); 
関連する問題