2015-05-04 10 views
6

Im sviluppo di un framework MVC e ho un problema sulla creazione di un flessibile di codice/struttura nel dichiarare classi helperPHP Estrazione array con classe come valore

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 chiamando la funzione nei miei controllori come questo

Class Home Extends Controller { 

    $this->load_helper('Form'); 

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

voglio chiamare la funzione come questa:

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

I cant utilizzare l'estratto per funzioni pubbliche ma ho visto framework che possono farlo. Spero che qualcuno abbia un'idea e che qualcuno possa capire la mia domanda, grazie in anticipo.

risposta

5

Dai un'occhiata al metodo magico __get. Dalla documentazione:

Il sovraccarico in PHP fornisce mezzi per "creare" dinamicamente le proprietà e metodi. Queste entità dinamiche sono elaborate tramite i metodi magici che si possono stabilire in una classe per vari tipi di azione.

I metodi di sovraccarico sono i nvoked quando interagisce con proprietà o metodi che non sono stati dichiarati o non sono visibili nel nell'ambito corrente. Il resto di questa sezione utilizzerà i termini "proprietà inaccessibili" e "metodi inaccessibili" per fare riferimento a questa combinazione di dichiarazione e visibilità.

la cui attuazione potrebbe ad esempio in questo modo:

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

Nota a margine:

Controller::$helper e Controller::load_helper() nella mia comprensione dovrebbe essere private o protected invece di public.

+1

Grazie signore. Non sono abituato ad usare metodi magici, ma questo mi ha davvero aiutato – mendz