Autor Zpráva
AM_
Profil
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
[#1] AM:
V té základní třídě můžete z konstruktoru načíst jeho parametry do pole, proiterovat a na __setovat.
Majkl578
Profil
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
[#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
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
[#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
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 :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: