Dynamické proměnné modelu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
baz
Člen | 42
+
0
-

Ahoj,
zkouším novou verzi NETTE a zároveň se pokouším obejít bez DIBI.

Ale velmi mi chybí chování objektu DibiRow, které umí na základě pole generovat proměnné do dané třídy.
Ve zdrojáku DibiRow jsem našel:

public function __construct($arr)
	{
		foreach ($arr as $k => $v) $this->$k = $v;
	}

Když se ale o to samé pokusím ve své tříde:

class QUser extends NObject {

	private $db;

	public function __construct(NConnection $db, Array $fill = NULL)
	{
		$this->db = $db;

		if($fill) {
			dump($fill);
			foreach($fill as $key => $val) {
				$this->$key = $val;
			}
		}
	}

hodí mi to tuhle chybu:
Cannot write to an undeclared property QUser::$id

Existuje nějaká možnost, jak tohle zprovoznit?
Pole, ze kterého vytvářím objekt je dost dlouhé a chtěl bych se vyhnout definování všech proměnných…

Díky za odpověď,
Otto

Editoval baz (8. 6. 2012 23:17)

bojovyletoun
Člen | 667
+
0
-

Nevím, zda je tento přístup nejlepší, ale k dotazu:
1.Cannot write to an undeclared property to je vlastnost Object, stačí nedědit OBject
2. využít magii __get, __set a property $data. – podobně jako zde Nette\Http\SessionSection::set()

Editoval bojovyletoun (8. 6. 2012 23:27)

baz
Člen | 42
+
0
-

Přiznám se, že si taky nejsem jist jestli to je správný přístup, ale nenapadají mě rizika, nebo důvody proč to psát ručně…

Každopádně díky za nasměrování, inspiroval jsem se nápovědou číslo 2 a vytvořil něco takového:

private $data;

public function &__get($name)
	{

		try {
			return parent::__get($name);
		} catch (MemberAccessException $e) {
			return $this->data[$name];
		}

	}

	public function __set($name, $value)
	{
		try {
			return NObjectMixin::set($this, $name, $value);
		} catch(MemberAccessException $e) {
			return $this->data[$name] = $value;
		}
	}