Zamanında bir nesnenin sınıfını değiştirmek

2 Cevap php

Ben bir CMS, Joomla ile çalışıyorum ve bir form, JParameter parametrelerin bir dizi işler çekirdek sınıf var. Temelde benim sitenin geri kalanı ile tutarlı değil bazı masa yüklü HTML çıktılar bir render() işlevi vardır.

Ben bu kullanılan başka hiçbir fikrim yok çünkü sürdürülebilirlik konuları için, ve, ben çekirdek kodunu değiştirmek istemiyorum. Ideal olacaktır Ne JParameter genişleten yeni bir sınıf tanımlamak ve sonra params bu yeni alt sınıf nesneyi aşağı benim $ döküm mümkün olur.

// 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

2 Cevap

Orada her zaman PECL's Classkit ama gerçekten oldukça bunu yapmak istemediğiniz bir duygu olsun. Doğrudan $this->params->render(), sadece alternatif bir render yapan bir fonksiyon / nesne (MyParamRenderer::render($this->params)) yapmak ve yerel dili tarafından desteklenmeyen OO cimnastiği kaçınmak isteyebilirsiniz diyorlar varsayarsak.

Ne tür bir dekoratör oluşturma hakkında o ayrı JParameter delegeler şey :: render () varolan bir nesneye

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;
    }
}

Ya da bu sadece çok koklamak?