Special „uninitialized“ value in PHP

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

Jak tak pouzivam doctrine, tak se mi tam jevi par WTF efektu, ktere v PHP nejde nijak vyresit. Jde o lazy-loading navazanych objektu. Viz priklad:

class Payment {
  /**
   * @ManyToOne(targetEntity="Customer") @JoinColumn(name="customer_id")
   */
  protected $customer;

  function merge(Payment $other) {
    $other->customer; // It's protected and I can use it, but it may be null because of lazy loading
    ...
  }
}

Stejne tak se mi nelibi automaticke generovani Proxy trid.

V noci me napadlo, jak se tohoto zbavit, a to podobnym principem, jako se ted vola __get($property). Resenim by byla specialni konstanta uninitialized, ke ktere kdyz by clovek pristoupil, tak by se zavolalo __initialize($property). Trida by takto mohla definovat lazy-loading vlastnosti, na ktere by se „dalo spolehnout“ a mohly by byt klidne i public.

Jeste to vsak neni ono, protoze bychom museli zaplevelit vsechny tridy metodou __initialize. Proto by se mohl vytvorit nejaky stack handleru podobny u autoloadingu trid. Tam bych si mohl zaregistrovat vlastni obsluhu:

spl_lazyloading_register(function($class, $propertyName) {
  $value = my_special_lazy_loader($class, $propertyName);
  $class->$propertyName = $value;
});

Takhle by se mohlo doctrine zaregistrovat a lazy-loadovat tridy podle potreby. Vlastnosti by najednou mohli byt i public nebo private a nemusely by se generovat zadne proxy tridy.

PS: To me napadlo ve spanku v ranni rozespalosti jsem si to promyslel, takze beru jakoukoliv kritiku.

PS2: jednalo by se spise of proof of concept nez neco, co byste meli zitra nasadit ve firme

uestla
Backer | 799
+
0
-

Tutonc máme ale Nette fórum :-(

Filip Procházka
Moderator | 4668
+
0
-

Je to magické, nesouvisí to s Nette a Proxy je regulérní návrhový vzor uznávaný kapacitami. Nevidím na něm nic špatného.

juzna.cz
Člen | 248
+
0
-

Jo sorry za spamovani nette fora, ale nenapadlo me lepsi misto s takovym poctem chytrych lidi jako tady.

Pokud nekdo chce namitat, ze je to moc WTF, tak mi prijde ze ani ne. Pouze tam, kde uz je magicke __get
by se pridalo jeste trosku vic magie ;)

Nox
Člen | 378
+
0
-

$customer nebude null pokud se budeš řídit manuálem a inicializovat kolekce v konstruktoru pomocí new ArrayCollection() … lepší kdyby se nemuselo, ale zas nic brutálního to není…

Editoval Nox (25. 6. 2011 1:19)