setter & getters
Pastaruoju metu dažnai apsirašinėjant objektus teko rašyti daug setter’ių ir getter’ių. Man, kaip ir manau daugumai programuotoju, pabodo vis rašyti tą patį, tad nusprendžiau panaudoti magiškas PHP funkcijas
Tiksliau užteko vienos __call(string $name, array $arguments). Kodas atrodo taip:
/**
* dynamic set & get methods
* @param string $name
* @param string $value
* @author aur1mas
*/
public function __call($name, $value)
{
/**
* lower 4th letter (in setter & getters it's first letter of property)
* @var string
*/
$name{3} = mb_strtolower($name{3}, 'utf-8');
if (strpos($name, 'set') !== false) {
$property = '_' . str_replace('set', '', $name);
if (property_exists($this, $property)) {
$this->$property = $value[0];
return;
}
}
else if (strpos($name, 'get') !== false) {
$property = '_' . str_replace('get', '', $name);
if (property_exists($this, $property))
return $this->$property;
}
else {
throw new Exception(
'Dynamic setting only supports set & get methods');
}
throw new Exception(
'Property: ' . $property . ' not found in object ('
. get_class($this) . ') declaration.');
}
Manau daugumai kodas yra aiškus. Atributus apsirašinėju su ‘_’ prefix’u (pagal Zend Framework standartą).
Kodo panaudojimo pavyzdys atrodytų taip:
<?php
class Human extends Base{
protected $_eyes;
}
$human = new Human();
$human->setEyes('brown');
Jei kam kyla kokių nors klausimų ar turite pastabų (bug’ų) – rašykit






Pawka
6 birželio, 2010
I like it. Analogiškai docrine 1.x berods yra. Aš tai mėgstu, kad kodas butų iš karto apibrėžtas (kad būtų galima suindeksuoti kodą su kokiu ctags arba vykdyt autocomplet’ą), tai naudoju metodus set($key, $value) ir analogišką get($key). Jų vidurys praktiškai analogiškas tavąjam. Nors iš kitos pusės, mano atveju vistiek reikia žinoti properčius, tai universalaus autocomplete’o kaip ir nebus. Tad situacija lygiavertė
Andrius
7 birželio, 2010
O bet tačiau. Ne tas pats būtų be jokių magi call’ų apsirašyti du metodus set($name, $value) ir get($name) ir tiesiog kviesti $human->set(‘eyes’, ‘brown’);, $human->get(‘eyes’);? Spėju implementinim’as performance atžvilgiu žymiai geresnis. Bet aš kažkodėl nenorėčiau nei to nei to. Tada variable scope praranda savo prasmę. Vienintelis privalumas, kad nedarai $human->eyes = ‘brown’. Ar aš čia kažko nepagaunu, ar čia toks pat viniojimas į vatą tik trim skirtingais būdais?
aur1mas
8 birželio, 2010
Na aš susiduriu su situacija, kad kai kuriuos set’us man reikia apsirašyti pvz. setId($id), nes reikia daryti cast’inimą į (int). Kitas pavyzdys būtų su objekto set’inimu, kai irgi reikia žinoti kokio tipo obj. perduoti, pvz. setOrder(Model_Order $order).
Ir tam, kad visur palaikyti vienodą struktūrą, pasirašiau tokį dinaminį set’inimą