我正在尝试找到一种使用闭包"重新声明"类的方法。这是我到目前为止得到的:
我有两个相同的简单类,除了命名空间。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 newnameA as A; // <-- dynamic
$a = new A();
$a->bla();
因此,这段代码只是从"new.php"类而不是"test2.php"中的类执行方法。这实际上是我需要的。但我的问题是代码的最后一部分。通常我会使用命名空间:
$a = new blaA(); //Defined in 'test2.php'
$a->bla();
但是由于"use as"语句,我必须将该行更改为:
$a = new A(); //Defined in 'test2.php'
$a->bla();
所以在"A()"前面没有命名空间。
有没有办法保留"bla\A()"命名空间(在test2.php中定义),但它仍然从"new.php"调用该方法?
在这种情况下,要从每个类调用,你应该写=>
$bla = new bla/A("");
$bla->bla(); // to call from bla.php
和二等舱
$newname = new newname/A("");
$newname->something(); // to call from newname.php
并且它会起作用,你不需要用use关键字过度工作脚本
此外,最好将类写在一个具有命名空间的文件中,例如 so =>
namespace bla{
class A{
// content
}
}
namespace newname{
class A{
// content
}
}
正如评论中所说,它不是一个"闭包"主题,而只是一个动态命名空间主题。
我认为你不能动态地使用 tue use
关键字。但是,PHP 是一种动态语言,您可以通过元编程动态选择您想要的类:
$wantedClass = 'myWantedNamespaceMyWantedClass';
$instance = new $wantedClass();