Věděli.
Co jste možná nevěděli o PHP: zapouzdření
Během učení se Smalltalku na diplomku jsem narazil na jednu zajímavost. Programovací jazyky z rodiny C (C, C++, Java, PHP) mají zapouzdření objektů na úrovni tříd, ne instancí (jako třeba Smalltalk).
V praxi to znamená, že pokud má objekt foo1 privátní instanční proměnnou boo, není tato proměnná přístupná zvenčí, ale je přístupná z objektu foo2, který je potomkem stejné třídy jako foo1.
Jednoduchá ukázka:
class Test { private $x; public function __construct($val) { $this->x = $val; } public function changeNeighbour($n, $val) { $n->x = $val; } public function getX() { return $this->x; } } $a = new Test(5); $b = new Test(1); $b->changeNeighbour($a, 2); echo $a->getX(); //vypise 2
Přiznejte se, vědeli jste to? :)
evaluation
comments
Věděl, děkuji za optání. :)
Samozřejmě, že věděli.
Proto existuje: http://www.php.net/manual/en/language.oop5.final.php
Nepřekvapuje mě to. Vím, že nějaké takové možnosti tu jsou, přesné hranice neznám. Ale nedávno jsem takto hackoval NotORM, ale tam bylo protected.
Vím, znám, nelíbí se mi to, ale už jsem to stejně použil. :)
#4 Buddhacz: Final s tím nijak nesouvisí. I když definujeme třídu jako final, stejně může jedna instance třídy měnit privátní instanční proměnné druhé instance třídy.
Ano, tohle není žádný hack ani specialita, používá se to dost často např. u singletonu, dále pak třeba u metod na porovnávání dvou instancí atd.
Já zase nevěděl, že to někdo neví :)))
Docela překvapující umí být, že k lze přistupovat k protected členům nejenom předků, ale i potomků třídy.
#10 David Grudl: Tak tohle prozměnu v kombinaci s Interface používam já... :)
Vidis...tohle jsem i vedel, ale tenhle dusledek mi nikdy nedosel...nebo jsem ho uz spis zapomnel a vzdycky me to prekvapi, kdyz ho uvidim znovu :-D
Věděl jsem to o protected atributech, o private ne :o)