延迟静态绑定以在扩展类中取消设置非静态数组

时间:2013-12-23 19:03:04

标签: php oop late-static-binding

我提前道歉,因为这有点令人费解。如果不是这样,我可能不会考虑这个问题。我正在使用一个允许扩展某些核心类而不是其他核心类的平台,但由于事件的顺序,我不确定我是否可以应用扩展类的更改而不会删除整个父方法(我想避免)。这是所涉及的课程链的一个愚蠢的版本:

主视图类(可扩展):

<?php

class ViewData {

    function display($main_data, $sub_id) {

        echo $main_data;

        $sub_data = new ViewSubData($sub_id);
        $sub_data->display();
    }
}

次要视图类(从上面的主类调用):

<?php

class ViewSubData {

    function ViewSubData($id) {
        $this->subdata = new SubData($id);
    }

    function display() {
        print_r($this->subdata['data']);
    }

}

辅助视图类的数据获取器:

<?php

class SubData {

    function SubData($id) {

        include("path/to/{$id}.php");   
        $this = $data_array["$id"]; 

    }
}

作为包含的数组提取的简化数据:

<?php

$data_array['xyz']['data']['fred'] = 'flintstone';
$data_array['xyz']['data']['barney'] = 'rubble';
$data_array['xyz']['data']['captain'] = 'caveman';

我对主类(上面第一个)的扩展,使用伪代码实现它的目标:

<?php

class MyViewData extends ViewData {

    function display($main_data, $sub_id) {

        // unset(ViewSubData::subdata['data']['fred']);
        parent::display($main_data, $sub_id)

    }
}

我已经阅读了关于后期静态绑定的文档,但它仍然不清楚它何时起作用,何时不起作用,在这种情况下,如果它可以静态绑定单个点的多个深度。如果这不是后期静态绑定的目的,是否有一些等效的方法从扩展的MyViewData::display方法静态调用数据提取器,以便当父进程非静态地调用它时,它已经有了修改后的数组和输出(或在这种情况下,不输出)修改后的数组成员?

1 个答案:

答案 0 :(得分:0)

我没有看到在这里任何地方使用的后期静态绑定,我想你可能会误解他们的目的。

无论如何,你的命题不会起作用,因为在实际构造任何实例之前,此类解决方案中的unset()将被称为。只有当 $subdata被声明为静态属性时才有可能,但整个设计没有多大意义。

您可以显式重载代码,而不是尝试使用父代码来满足您的特定需求。而不是做像

这样的事情
class MyViewData extends ViewData
{
    function display($main_data, $sub_id)
    {
        // unset(ViewSubData::subdata['data']['fred']);
        parent::display($main_data, $sub_id)
    }
}
你可以做点什么

class MyViewData extends ViewData
{
    function display($main_data, $sub_id)
    {
        echo $main_data;
        $sub_data = new ViewSubData($sub_id);
        //unset($sub_data->subdata['data']['fred']);
        //^ this is going to work since ViewSubData has filled its members in constructor
        $sub_data->display();
    }
}

现在您不必担心unset()是否有效,以后其他任何人都不会在以后处理此代码。

作为一个侧面节点,将$this设置为任何东西看起来像是在寻找麻烦,而整个设计看起来会让以后更加头痛。你考虑过另一种方法吗?您可以使用json_encode代替include $x并将其结果绑定到某个特定成员,而不是$this