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? :)

Hodnocení

Komentáře

2010-09-12 18:23:03

Věděl jsem to o protected atributech, o private ne :o)

2010-09-12 18:36:13

Věděli.

[3] kaja47
2010-09-12 19:35:20

Věděl, děkuji za optání. :)

[4] Buddhacz
2010-09-13 00:04:34

Samozřejmě, že věděli.

Proto existuje: http://www.php.net/manual/en/language.oop5.final.php

Na tento komentář odpověděl [7] Dundee
[5] v6ak
2010-09-13 08:39:53

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.

2010-09-13 08:59:40

Vím, znám, nelíbí se mi to, ale už jsem to stejně použil. :)

[7] Dundee
2010-09-13 09:23:38

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

[8] Optik
2010-09-13 22:12:10

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.

2010-09-14 12:45:12

Já zase nevěděl, že to někdo neví :)))

2010-09-14 12:54:42

Docela překvapující umí být, že k lze přistupovat k protected členům nejenom předků, ale i potomků třídy.

Na tento komentář odpověděl [11] SendiMyrkr
[11] SendiMyrkr
2010-09-22 10:32:14

#10 David Grudl: Tak tohle prozměnu v kombinaci s Interface používam já... :)

2010-10-10 21:07:11

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

Komentáře již nelze přidávat