2012-04-09 76 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();