我提前道歉,因为这有点令人费解。如果不是这样,我可能不会考虑这个问题。我正在使用一个允许扩展某些核心类而不是其他核心类的平台,但由于事件的顺序,我不确定我是否可以应用扩展类的更改而不会删除整个父方法(我想避免)。这是所涉及的课程链的一个愚蠢的版本:
<?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
方法静态调用数据提取器,以便当父进程非静态地调用它时,它已经有了修改后的数组和输出(或在这种情况下,不输出)修改后的数组成员?
答案 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
。