2015-05-04 14 views
6

Im opracowanie ram MVC i mam problem na co elastycznego kodu/konstrukcji w deklarowania klas pomocnikówPHP Wyodrębnianie tablicę z klasy jako wartość

class Controller { 
    public $helper = []; 

    public function load_helper($helper) { 
     require_once(DIR_HELPER . $helper . '.php'); 
     $lc_helper = StrToLower($helper); 
     $helper_arr[$lc_helper] = new $helper; 
     $this->helper[$lc_helper] = $helper_arr[$lc_helper];  
    } 
} 

// Im wywołanie funkcji w moich kontrolerami jak ten

Class Home Extends Controller { 

    $this->load_helper('Form'); 

    $this->helper['form']-><class function>; 
} 

chcę wywołać funkcję tak:

$this->form-><class function>; 

cant korzystania wyciąg dla publicznych funkcji, ale widziałem ram, które mogą to zrobić. Mam nadzieję, że ktoś ma pomysł i że ktoś może zrozumieć moje pytanie, z góry dzięki.

Odpowiedz

5

Spójrz na magiczną metodę __get. Z dokumentacji:

Przeciążenie w PHP zapewnia metody dynamicznego "tworzenia" właściwości i metody. Te dynamiczne elementy są przetwarzane za pomocą magicznych metod, które można ustalić w klasie dla różnych typów działań.

Metody przeciążenia są i nvoked podczas interakcji z właściwościami lub metodami, które nie zostały zgłoszone lub nie są widoczne w bieżącej zakresie . W pozostałej części tej sekcji użyje się terminów "niedostępne właściwości" i "niedostępne metody" w odniesieniu do tej kombinacji deklaracji i widoczności.

To może być realizowane na przykład w ten sposób:

class Controller { 
    public $helper = []; 

    public function load_helper($helper) { 
     require_once(DIR_HELPER . $helper . '.php'); 
     $lc_helper = StrToLower($helper); 
     $helper_arr[$lc_helper] = new $helper; 
     $this->helper[$lc_helper] = $helper_arr[$lc_helper];  
    } 

    public function __get($property) { 
     //Load helper if not exists 
     if (!isset($this->helper[$property])) { 
      $this->load_helper($property); 
     } 

     //Return the helper 
     return $this->helper[$property]; 
    } 
} 

Notatka:

Controller::$helper i Controller::load_helper() w moim rozumieniu powinien być private lub protected zamiast public.

+1

Dziękuję, proszę pana. Nie używam magicznych metod, ale ten naprawdę mi pomógł – mendz

Powiązane problemy