PHP匿名类扩展动态类

19

你们中有人知道如何获得类似于这些代码中的效果吗?

 public function create(SomeInterface $obj)
 {
     $class = get_class($obj);
     return new class extends $class {
        //some magic here
     }
 }

很明显,这段代码不能在PHP中执行。

$obj 可以是许多不同类的实例。我想获取一个扩展了 $obj 类的实例。(这将使我能够重载一些基本方法)


5
这很明显不是重复的,因为PHP7提供了匿名类。http://php.net/manual/zh/language.oop5.anonymous.php - Marcel
你是正确的。无论如何,对我来说答案似乎是相似的。只有使用“eval”,但我不想使用它... - adeptofvoltron
这个回答解决了你的问题吗?PHP类在运行时动态扩展 - DigiLive
1个回答

1
有PHP 7+版本,非常容易实现。下面是一个简单的示例:
interface SomeInterface {};
class one implements SomeInterface {};
class two extends one {};

function create(SomeInterface $class) {
    $className = get_class($class);
    return eval("return (new class() extends $className {});");
}

$newTwoObj = create(new two());

请注意,这将返回一个匿名对象的新实例。我不认为有任何方法可以返回对类的引用(未实例化)。
还要注意,这使用了eval()函数,我通常不赞成使用它,但这是我能找到的唯一一种动态分配继承的方法(而不使用只能使用一次的class_alias())。您需要非常小心,不允许传入未经过滤的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接