2012-04-09 78 views
1

我試圖找到一種方法來使用閉包來重新聲明一個類。這是我到目前爲止:使用動態命名空間重新聲明類


我有兩個相同的簡單類,除了名稱空間。 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(); 

所以這一段代碼簡單地從「new.php」類,而不是在「test2.php」類執行方法。這實際上是我需要的。但我的問題是代碼的最後一部分。通常我會一直使用的命名空間:

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

因爲聲明「爲使用」我要改變該行不過:

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

因此,沒有的「一個命名空間盈() 」。

有沒有辦法保留「bla \ A()」命名空間(在test2.php中定義),但它仍然從「new.php」調用方法?

+1

順便說一句,而不是擁有一切'use'它是一個封閉。閉包是匿名函數,它們共享來自外部範圍的變量。在這種情況下使用''將被稱爲別名或導入或沿着這些線:) – NikiC 2012-04-09 10:59:36

+0

如果兩個類是相同的,那麼爲什麼你需要兩個類? DRY http://en.wikipedia.org/wiki/Don%27t_repeat_yourself – GordonM 2012-04-09 11:05:02

回答

1

在這種情況下,從每種類別的呼叫,你應該寫=>

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

和第二類

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

,它會工作,你不需要在使用過度勞累腳本關鍵字

也是很好的做法,在一個文件中使用名稱空間編寫類,如下所示=>

namespace bla{ 
    class A{ 
     // content 
    } 
} 

namespace newname{ 
    class A{ 
     // content 
    } 
} 
+0

我知道我可以這樣做。但是我想'重新聲明'這個類的原因是因爲我想'修補'舊的bla \ A()類。所以我想能夠調用bla \ A(),但它應該從newname \ A()執行方法。該技術被稱爲猴子補丁,所以我知道這是可能的。只是不確定如何。 – w00 2012-04-09 11:07:07

+0

對不起,但我不明白你要做什麼:( – tnanoba 2012-04-09 11:12:59

1

就像在評論中說的那樣,它不是「封閉」主題,而只是動態命名空間主題。

我不認爲你可以動態地使用tue use關鍵字。 然而,PHP是一種動態語言,可以動態地選擇你想要的類元編程:

$wantedClass = 'myWantedNamespace\MyWantedClass'; 
$instance = new $wantedClass();