动态类扩展

Ema*_*sev 5 php oop

有没有办法定义一个类,以便只有在其他类可用时才扩展另一个类?

Gor*_*don 8

没有任何东西可以让你做

class Foo extendsIfExist Bar
Run Code Online (Sandbox Code Playgroud)

但是你可以用猴补丁美孚runkit

PHP手册示例:

class myParent {
  function parentFunc() {
    echo "Parent Function Output\n";
  }
}

class myChild {
}

runkit_class_adopt('myChild','myParent');
myChild::parentFunc();
Run Code Online (Sandbox Code Playgroud)

runkit扩展可从PECL获得.然而,它的使用是不鼓励的,因为需要它几乎总是一个有缺陷的设计的指标.


免责声明:我只假设类似以下示例的内容是您提出问题的原因.如果不是,请忽略那部分答案.

如果您在运行时有条件地需要某些功能,请考虑聚合您想要扩展的类,例如尝试一些类似的东西

interface Loggable
{
    public function log($message);
}
class Foo implements Loggable
{
    protected $logger;
    public function setLogger($logger)
    {
        $this->logger = $logger;
    }
    public function log($message)
    {
        if($this->logger !== NULL) {
            return $this->logger->log($message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我们想要的功能是log().因此,我们不是检测记录器类是否可用,然后将此功能伪装到我们的Foo类中,而是通过添加接口Loggable来告诉它需要此功能.如果存在Logger类,我们在Foo中实例化并聚合它.如果它不存在,我们仍然可以调用日志,但它不会做任何事情.这更加稳固.