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