Pridanie hodnoty do pola ktore je protected
- majo
- Člen | 21
Mam object ktory ma protected property
class Trieda extends \Nette\Object {
protected $pole = [1,2,3];
function &__get($name) {
// ziska hodnotu
}
function __set($name, $value) {
// overi hodnotu
$this->{$name} = $value;
}
}
Je mozne nejak zvonku pridat do pola nejaku hodnotu zapisom:
$objekt->pole[] = 4;
Velmi by sa mi to zislo, aj keby to slo krkolomnym sposobom.. Zatial som prisiel len nato, ze pokus o vlozenie pride do &__get ako poziadavka na property pole…
Dik za kazdu radu
- Martk
- Člen | 661
Ten kód co jsi posílal bude fungovat, protože v magické metodě __get vracíš pole jako referenci. Pokud potřebuješ kontrolovat hodnoty, tak asi toto, ale zkusil bych to vyřešit jiným řešením.
class ArrayAccessObj implements ArrayAccess {
// ...
}
class Trieda extends \Nette\Object {
protected $pole;
function __construct() {
$this->pole = new ArrayAccessObj;
}
function &__get($name) {
// ziska hodnotu
}
function __set($name, $value) {
// overi hodnotu
$this->{$name} = $value;
}
}
Editoval Martk (28. 2. 2017 20:24)
- majo
- Člen | 21
CZechBoY: uz to mam v podstate hotove a kvoli tejto poslednej zaludnosti s polom nechcem prekopavat cely system funkcnosti. Jedna sa o triedu, ktora ma definovane protected properties s ktorymi sa bude moct v triede pracovat (nieco podobne ako Doctrine 2 Entity). Cez magiu si data do tychto properties overujem, pretoze sa do triedy nemoze nic nevalidne dostat. Vsetko funguje pohodlne, nepouzivam na vkladanie dat ziadnu metodu z vonku, iba toto pole je posledna zaludnost a moc nerad by som to riesil append() pretoze by som musel do nej posielat aj nazov property, kedze poli moze byt viac.
Vyskusam teda \ArrayAccess alebo Utils ArrayHash
- majo
- Člen | 21
ano, to sa da aj u mna, ale setter pouzivam len na pripady ked sa ma obist validacia vnutri triedy (cize len vynimocne), alebo inak ziskat hodnotu atd… Defaultne chcem aby automaticky najprv overilo ci existuje property, ak existuje, validovat hodnotu, a az ked je validna ju ulozit do property.. keby som to mal riesit cez setteri tak v kazdom jednom musim hodnotu poslat este do validatora (alebo validovat tam).. to by som sa upisal k smrti..
co je lepsie?:
/** @Tag(type="string", length="50") */
protected $property;
// v predkovy sa spracuje magiou __get a __set
kde vdaka anotacii trieda vie, aka hodnota tam moze ist
alebo
protected $property;
function setProperty($value) {
if (is_string($value)) ... // alebo inak validovat
$this->property = $value;
}
// atd ku kazdej property napisat setter a getter
- majo
- Člen | 21
myslim to tak, ze ak by som nevyuzival magiu tak by som musel ku kazdej property napisat getter a setter… teraz len jednoducho definujem property (v anotaciach zvolim co ma obsahovat) v triede a __set si to vyriesi (zisti ci vobec existuje property, ak ano, tak validuje hodnotu atd).. magiu som zvolil hlavne kvoli tomu aby som sa neupisal.. ak ma trieda 10 properties tak je unavne pisat 10× setter a getter, nie? a to nevravim o zvyseni moznosti pripadnej chyby.. v niektorych pripadoch je magia fajn podla mna..
- majo
- Člen | 21
ano, ide presne o to, ze je tam viac validaci podla „typu“ property, a aby toho nebolo malo, tak este kazdy tento „typ“ ma svoju dalsiu validaciu :), je to proste zlozitejsie .. ja som to na zaciatku riesil settermi, ale pri vacsich mnozstvach properties to bol postupne horor, od ktoreho som musel upustit a uchylit sa ku kuzleniu..