Autor | Zpráva | ||
---|---|---|---|
AM_ Profil |
#1 · Zasláno: 26. 2. 2010, 09:55:04
Ahoj,
tak mě napadlo, když člověk pořád píše konstruktory typu function __construct($param1, $param2 ...){ $this->param1 = $param1; $this->param2 = $param2; ... } Neexistuje nějaká cesta, jak tohoto dosáhnout implicitně pro všechny konstruktory (které třeba podědí základní třídu), aniž bych to musel pokaždé znova rozepisovat? díky. |
||
Aesir Profil |
#2 · Zasláno: 26. 2. 2010, 10:37:54
[#1] AM:
V té základní třídě můžete z konstruktoru načíst jeho parametry do pole, proiterovat a na __setovat. |
||
Majkl578 Profil |
#3 · Zasláno: 26. 2. 2010, 10:55:02 · Upravil/a: Majkl578
Zkusil jsem napsat takové zajímavé řešení pomocí reflexe a phpDoc.
abstract class Base { final public function __construct() { $args = func_get_args(); $r = new ReflectionClass($this); preg_match('~@constructorOrder (.*)~m', $r->getDocComment(), $match); $argsOrder = explode(', ', $match[1]); if (count($args) !== count($argsOrder)) { throw new Exception('Argumenty musí mít stejný počet prvků jako definice'); } foreach (array_combine($argsOrder, $args) as $key => $value) { $this->$key = $value; } } } /** * @constructorOrder foo, bar, baz */ class Foo extends Base { } $foo = new Foo('x', 'y', 'z'); echo $foo->bar; Třída Foo má parametry konstruktoru definované v komentáři u @constructorOrder Aesir: To nemůže, nezná názvy parametrů. |
||
Aesir Profil |
#4 · Zasláno: 26. 2. 2010, 11:37:37
[#3]Majkl578:
„To nemůže, nezná názvy parametrů.“ Vím, je nutné se samozřejmě spoléhat na pořadí parametrů, ať už v definici nebo v phpDoc ve vašem případě. Takže v mém případě by to znamenalo přes get_class_vars zjistit názvy a v té iteraci přiřadit hodnoty dle pořadí. U těchto způsobů je však hodně důležitá dobrá dokumentace a dobře napovídající IDE :) |
||
AM_ Profil |
#5 · Zasláno: 26. 2. 2010, 16:54:38
Majkl578:
Jo, to je pěkné řešení, díky :) Aesir: To by šlo taky, ale není už to tak "sexy"; navíc by se muselo ještě nějak definovat, které přesně členské proměnné chceme, aby konstruktor nastavoval, a to už moc nabývá na složitosti. |
||
Aesir Profil |
#6 · Zasláno: 26. 2. 2010, 17:43:21
[#5] AM:
Použití reflection je určitě víc sexy, já používám get_class_vars kvůli tomu, že poměrně jednoduše ohlídá právě přístup k členským proměnným. Navíc se vyhnu parsování komentářů a reguláru :) |
||
AM_ Profil |
#7 · Zasláno: 26. 2. 2010, 17:59:17
Aesir:
„já používám get_class_vars kvůli tomu, že poměrně jednoduše ohlídá právě přístup k členským proměnným“ To jo, ale zpravidla ne všechny členské proměnné chceš vyplnit konstruktorem, a dávat si pozor na to, že mezi ně v budoucnu nedeklaruješ nějakou jinou, a vůbec dávat pořadí jejich deklarace nějaký význam, je takové dost chatrné. Já si třeba u velkých tříd řadím vlastnosti a metody nejdříve podle třídy přístupu a pak podle abecedy a nechci to měnit :) |
||
Časová prodleva: 14 let
|
0