php 匿名类扩展动态

2022-08-30 22:30:25

你们中的任何一个人都知道如何获得像这些代码一样的效果

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

显然,代码在PHP中不起作用。 可以是许多不同类的实例。我想得到一个类的实例来扩展$obj(这将使我能够重载一些基本方法)$obj


答案 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()


答案 2

推荐