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 に答える