0

私はCMSのJoomlaを使用していますが、パラメーターのセットをフォームJParameterにレンダリングするコアクラスがあります。基本的にrender()、それは私のサイトの他の部分と一致しないいくつかのテーブルを含むHTMLを出力する機能を持っています。

保守性の問題について、そしてこれが他にどこで使用されているのかわからないので、コアコードを変更したくありません。理想的なのは、JParameterを拡張する新しいクラスを定義してから、$paramsオブジェクトをこの新しいサブクラスにキャストできることです。

// existing code --------------------
class JParameter {
    function render() {
        // return HTML with tables
    }
    // of course, there's a lot more functions here
}

// my magical class -----------------
class MyParameter extends JParameter {
    function render() {
        // return HTML which doesn't suck
    }
}

// my code --------------------------
$this->params->render();    // returns tables
$this->params = (MyParameter) $this->params;  // miracle occurs here?
$this->params->render();    // returns nice html
4

2 に答える 2

3

PECL の Classkitは常にありますが、これはやめたほうがいいと思います。を直接呼び出していると仮定すると$this->params->render()、代替レンダリング ( MyParamRenderer::render($this->params)) を実行する関数/オブジェクトを作成し、言語でネイティブにサポートされていないオブジェクト指向の体操を実行しないようにすることができます。

于 2008-12-23T02:00:38.907 に答える
2

JParameter::render() 以外のものを既存のオブジェクトに委譲するようなデコレータを作成するのはどうでしょうか。

class MyJParameter {
    private $jparm;
    function __construct( JParameter $jparm ) {
        $this->jparm = $jparm;
    }
    function render() {
        /* your code here */
    }
    function __get( $var ) {
        if( isset( $this->$jparm->$var ) {
            return $this->$jparm->$var;
        }
        return false;
    }
    function __set( $var, $val ) {
        /* similar to __get */
    }
    function __call( $method, $arguments ) {
        if( method_exists( $this->jparm, $method ) {
           return call_user_func_array( array( $this->jparm, $method ), $arguments );
        }
        return false;
    }
}

それともこれはあまりにも臭いですか?

于 2008-12-23T09:58:24.730 に答える