2009-09-25 12 views
11

Regularnie tworzę klasę, która ma kilka zmiennych prywatnych. Po ustawieniu instancji tej klasy, powinno być możliwe wypełnienie wszystkich zmiennych klasy przez moduły pobierające i ustawiające.Jaki jest najlepszy sposób automatycznego generowania pobierających i ustawiających dla klasy w php?

Czy istnieje prosty sposób, aby to zrobić bez wpisywania wszystkich tych ustawiaczy i modułów pobierających dla każdej zmiennej podczas tworzenia klasy?

teraz mam wpisać ten dla każdego var w klasie

public function setVar($var){ 
$this->var = $var; 
} 

i

public function getVar(){ 
return $this->var; 
} 

Teraz użyć RegExp, ale nie wiem, czy jest to najprostszy sposób .. Używamy Eclipse jako środowiska, więc może jest kilka przydatnych wtyczek?

+0

Chociaż trudno jest zająć dużo czasu, aby je wdrożyć. Zwykle robię to, gdy jem lunch. Jeszcze lepiej, przekaż kod uczniowi, aby go dodać. – Chris

+0

@Chris Przekaż go komuś innemu, nie można uznać za dobre rozwiązanie. Student lub dodatek może również chcieć znaleźć odpowiednie rozwiązanie ... – Kennethvr

Odpowiedz

33

z Eclipse przejdź do Ustawienia -> PHP -> Edytor -> Szablony -> Nowe i używać coś takiego:

private $$${PropertyName}; 
${cursor}  
public function get${PropertyName}() 
{ 
    return $$this->${PropertyName}; 
} 

public function set${PropertyName}($$value) 
{ 
    $$this->${PropertyName} = $$value; 
} 

Aby użyć szablonu wpisz jego nazwę, a następnie naciśnij Ctrl + Spacja - menu kontekstowe powinny również automatycznie pojawiają się po wpisaniu nazwy.

+0

Jakieś poprawki związane z używaniem wielbłąda w tych właściwościach? – porfiriopartida

+0

@porfiriopartida Zastanawiałem się nad tym samym i zakończyłem używanie innej zmiennej w get i zestawie. Podczas korzystania z szablonu wystarczy ustawić właściwość i funkcję gettera. ;-) – andreas

2

Przyjrzałeś się metodom __set i __get? Nie wiem, czy to jest to, co masz na myśli, ale są one automatycznie wywoływane, gdy członek klasy jest SET lub Retrieved/Fetched/Accessed.

0

Może lepiej sollution:

class base { 

    protected $_vars = array(); 


    public function setVar($name, $value = null) { 
     $this->_vars[$name] = $value; 
    } 

    public function getVar($name) { 
     return isset($this->_vars[$name]) ? $this->_vars[$name] : null; 
    } 
} 

i po prostu przedłużyć tę klasę. Możesz też użyć metod __set i __get, ale są one wolniejsze.

+0

To może być dobre rozwiązanie, ale czy dobrze jest umieścić wszystkie w tablicy, a nie wszystkie jako różne vary? czy to nie ma znaczenia? – Kennethvr

+1

Jeśli działa dane (takie jak tablice, łańcuchy itp.), To jest OK. Ale jeśli chcesz ustawić niektóre obiekty, takie jak obiekt bazy danych lub inne, nie powinieneś tego robić. Następnie użyj konstruktorów lub innych sposobów. – Pawka

+0

Czy jesteś pewien, że __set i __get mehods są powolne? – andho

1

Zend Studio posiada funkcję automatycznego generowania getter/setter.

1

Myślę, że najlepszym sposobem jest użycie __set i __get z niektórymi funkcjami ciągów, Tutaj pozwól mi pokazać.

class UserProfile 
{ 
    public function __get($key) 
    { 
     if(isset($this->$key)) 
     { 
      return $this->$key; 
     } 
    } 

    public function __set($key,$val) 
    { 
     $this->cahnge($key,$val); 
    } 

    public function __call($key,$params) 
    { 
     if(substr("set",$key)) 
     { 
      //Update 
     }elseif(substr("get",$key)) 
     { 
      //return 
     } 

     //Else Blah 
    } 

    private function change($key,$val) 
    { 
     if(isset($this->$key)) 
     { 
      $this->$key = $val; 
     } 
    } 
} 

__call() metoda pozwoli Ci ustawić z funkcjami takimi jak

$profile->setUsername('Robert Pitt'); Dopóki substr zestaw/get i sprawdzić reszty napisu jako wartość klasy:)

kolejnym przykładem

public function __call($method,$params = array()) 
{ 

    if(isset($params[0]) && is_string($params[0])) 
    { 
     $this->$method = $params[0]; 
    } 
} 

//.... 

$profile->username('Robert Pitt'); 

Theres więcej do zrobienia tutaj

+0

czy jesteś pewien, że to działa? Nie mogłem tego zarządzać. czy to jest jakaś magia PHP? Mogę zadzwonić do '$ profile-> __get (nazwa użytkownika)' ale chciałem zadzwonić '$ profile-> getUsername()' – azerafati

Powiązane problemy