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)) 的函数/对象,并避免执行该语言本身不支持的 OO 体操。

于 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 回答