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();

所以在“A()”前面没有命名空间。

有没有办法保留“bla\A()”命名空间(在 test2.php 中定义),但它仍然从“new.php”调用方法?

4

2 回答 2

1

在这种情况下,要从每个类调用,您应该编写 =>

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

和二等

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

它会起作用,您不需要使用 use 关键字过度使用脚本

将类写在一个具有这样命名空间的文件中也是一种好习惯 =>

namespace bla{
     class A{
        // content
     }
}

namespace newname{
     class A{
        // content
     }
}
于 2012-04-09T11:04:02.807 回答
1

正如评论中所说,它不是“关闭”主题,而只是动态命名空间主题。

我认为您不能use动态使用 tue 关键字。但是,PHP 是一种动态语言,您可以通过元编程动态选择所需的类:

$wantedClass = 'myWantedNamespace\MyWantedClass';
$instance    = new $wantedClass();
于 2012-04-09T11:05:26.363 回答