Special „uninitialized“ value in PHP
- juzna.cz
- Člen | 248
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
- Filip Procházka
- Moderator | 4668
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.