sobota, 12 lutego 2011

Lazy loading metod

Dzięki Eagle z devpytania.pl poradziłem sobie z małym problemem z pracy. Otóż mieliśmy klasę modelu, która zawierała 218 metod i około 20 tysięcy linii kodu. Obciążające to było i spasione strasznie. Przerobiłem klase modelu na:

<?php
class Model_Methods
{

    protected $_name = '';

    public function __call($name, array $params)
    {
        $className = "Model_Methods_".$name[0];
        $xClass = new $className;
        return $xClass->$name($params[0],$aParams[1]);
    }
}

Następnie wszystkie metody poupychałem według nazw do klas dziedziczących po powyższej znajdujących się w katalogu Methods w plikach A.php, B.php, C.php itd. aż do Z.php

Przykładowy plik:

<?php
class Model_SeoApi_Methods_T extends Model_Methods {
    public function test($aParams, $sFormat)
{
var_dump($aParams);
var_dump($sFormat);
}
}

Tym sposobem uruchamiam metodę Model_Methods::test(), co powoduje, że autoloader zenda dołącza plik Methods/T.php, tworzy obiekt klasy T i uruchamia metodę. Mało tego - działają wewnętrzne odwołania do metod itd. Przy dodaniu __set i __get w klasie bazowej można nawet odwoływać się do wspólnych dla wszystkich metod atrybutów klasy.

0 komentarzy:

Prześlij komentarz