Pridanie hodnoty do pola ktore je protected

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

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
+
0
-

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)

CZechBoY
Člen | 3608
+
+2
-

Co treba nepouzivat magii a pouzit metodu?

private $arr = [];
public function append($item)
{
    $this->arr[] = $item;
}

Radsi poradne popis co potrebujes…

Editoval CZechBoY (28. 2. 2017 20:55)

majo
Člen | 21
+
0
-

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

CZechBoY
Člen | 3608
+
+1
-

@majo i v doctrine entity si můžeš udělat settery nebo jiný metody a nemusíš teda používat magii.

majo
Člen | 21
+
0
-

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
CZechBoY
Člen | 3608
+
0
-

To nechápu, však setter metoda a __set je úplně to stejný (metoda) – až na to že __set je magic.

majo
Člen | 21
+
0
-

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..

CZechBoY
Člen | 3608
+
0
-

@majo můžeš si to vygenerovat v IDE, samozřejmě pokud potřebuješ další validaci tak tu už musíš napsat ručně (pokud není stejná, jinak můžeš použít nějakej find&replace nebo live template v IDE).

majo
Člen | 21
+
0
-

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..