我正在使用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
答案 0 :(得分:3)
总有PECL's Classkit,但我觉得你真的不愿意这样做。假设您直接调用$this->params->render()
,您可能只想创建一个执行备用渲染(MyParamRenderer::render($this->params)
)的函数/对象,并避免执行该语言本身不支持的OO体操。
答案 1 :(得分: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;
}
}
或者这太臭了?