可访问父级的设计模式策略 class

design pattery strategy with access to parent class

我想使用 php 实现策略设计模式:

interface dummy_function {
    public function render();
}

class a implements dummy_function {
    public function render() {
        echo "class a\n";
        // I want to acess x_main::dummy like: echo parent::dummy
    }
}

class b implements dummy_function {
    public function render() {
        echo "class b\n";
        // I want to acess x_main::dummy like: echo parent::dummy
    }
}

class x_main {

    public $dummy = "hello world";

    public function setX_Function( dummy_function $funcname ) {
        $this->x_function = $funcname;
    }

    public function render() {
        $this->x_function->render();
    }
}


$test = new x_main();
$test->setX_Function( new a() );
$test->render();

在我的 classes 中,我想访问主要 class 中定义的一些方法和变量。不幸的是,"parent" 无法访问 class "x_main" 实现中的内容 classes.

我发现的一种方法是将 $this 作为方法 "render" 的参数,例如:

class x_main {
    [...] 
    public function render() {
        $this->x_function->render( $this );
    }
}

class a implements dummy_function {
    public function render( $mainclass ) {
        echo "class a\n";
        echo $mainclass->dummy;
    }
}

我测试的下一个方法是将 class main 中的变量直接设置到已实现的函数中,例如:

class x_main {

    [ ... ]     
    public function setX_Function( dummy_function $funcname ) {
        $this->x_function = $funcname;
        $this->x_function->dummy = $dummy;
    }

}

class a implements dummy_function {
    public function render() {
        echo "class a\n";
        echo $this->dummy;
    }
}

这两种解决方案都有效,但如果这是实现我想要的想法的最佳方式,我会感到有点困惑。它看起来非常像一种解决方法,但不像真正的 OO 编程。

我期待着您的想法。

重复上面的评论:

The two classes aren't related in any way, they certainly don't have a parent relationship. One object holding an instance of another object does not mean these two objects are in any sort of relationship with one another. You simply need to explicitly pass data into your dummy_function instance; e.g.: public function render(array $data).

回复:

In my first solution I put the whole mainclass as parameter to the render function. So this is a solution that will work in any case. But if there is definitivly no relationship between these two objects I prefer my second solution by setting the parameters directly with $this->x_function->dummy = $dummy;

很抱歉告诉你你错了。在对象上隐式设置 属性 绝不是 定义的接口 。我不是在 PHP 的 interface 关键字的意义上使用这个词,我的意思是在更广泛的意义上 指定两段代码如何交互和合作.

您在为 render() 函数指定和使用 interface 方面做得很好,这大大降低了代码耦合并提高了灵活性和可测试性。现在你又通过使用未定义和脆弱的 属性 赋值来破坏它。

您需要将 将数据传递到 render 方面作为接口规范的一部分。例如:

interface dummy_function {
    public function render(array $data);
}

或:

interface dummy_function {
    public function setData(array $data);
    public function render();
}

或更好:

interface DummyData {

    /**
     * @return string
     */
    public function getDummyData();

}

interface DummyRenderer {

    public function render(DummyData $data);

}

有了这个你是:

  • 明确指定数据的格式 (string)
  • 编码 render() 可以访问此类数据的地方(它将接收一个 DummyData 对象,该对象具有 getDummyData() 方法)

您无需猜测涉及哪些 属性 个名称或传递的对象具有什么结构。