0

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

主视图类(可扩展):

<?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方法静态调用数据获取器,以便当父级非静态调用它时,它已经具有修改后的数组和输出(或在这种情况下,不输出)修改的数组成员?

4

1 回答 1

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.

于 2013-12-23T21:56:28.620 回答