1

我的问题是我想在抽象类公共属性中拥有一个动态值(类的实例)。

我想将一个实例存储在不允许这样的变量中。

// Not allowed
abstract class Abs{
    public $var = new VarClass();
}

// This only works for extended childrens of course, but it should work globally.
class B extends Abs{
    function __construct(){
        $this->var = new varClass();
    }
}

我需要这是全球性的。可悲的是,抽象类不能有理想的构造函数......魔术方法也不是解决方案,因为系统在运行时定义类变量,所以未定义的变量也会运行到魔术方法中......

4

2 回答 2

1

依赖注入模式优雅地解决了您的问题。检查 GitHub 上的 Pimple 以获得极简但有效的解决方案或使用 symfony2 依赖注入组件。

GitHub上的疙瘩

使用依赖注入容器可以避免耦合,或者可以传递接口而不是类。

于 2013-11-08T14:22:21.100 回答
0

依赖注入可以解决您的问题

abstract class Abs{
   //...
}


class B extends Abs{
    private $var;
    public function setVarClass(varClass $class){
         $this->var = $class;
    }
 }

 //example
 $classVar = new varClass;
 $b = new B;
 $b->setVarClass($classVar);

这是解决至少紧密耦合问题的灵活方法,记住Object总是被引用。

于 2013-11-08T14:21:45.683 回答