我正试图找到一种方法来使用闭包'重新声明'一个类。这是我到目前为止所得到的:
除了命名空间之外,我有两个相同的简单类。 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();
但由于'use as'语句,我必须将该行更改为:
$a = new A(); //Defined in 'test2.php'
$a->bla();
因此没有“A()”前面的命名空间。
有没有办法保留“bla \ A()”命名空间(在test2.php中定义),但它仍然从“new.php”调用方法??
答案 0 :(得分:1)
在这种情况下,要从每个班级打电话,你应该写=&gt;
$bla = new bla/A("");
$bla->bla(); // to call from bla.php
和第二课
$newname = new newname/A("");
$newname->something(); // to call from newname.php
它将起作用,您不需要使用关键字
过度使用脚本最好在一个文件中编写带有名称空间的类,例如so =&gt;
namespace bla{
class A{
// content
}
}
namespace newname{
class A{
// content
}
}
答案 1 :(得分:1)
正如在评论中所说,它不是一个“闭包”主题,而只是动态命名空间主题。
我认为您不能动态使用tue use
关键字。
但是,PHP是一种动态语言,您可以使用元编程动态选择所需的类:
$wantedClass = 'myWantedNamespace\MyWantedClass';
$instance = new $wantedClass();