ugrás a tartalomhoz

PHP OOP láthatóság

Max Logan · 2007. Nov. 8. (Cs), 16.18
Egy régebben megírt osztályomat kell egy kicsit kibővítenem. A metódusokhoz nem állítottam be a láthatóságot, ergó ezek publikus metódusok lettek. Mivel lényegében csak egyet kell látni kívülről ezért a többinek beállítottam, hogy private, valamint volt egy eleve private változó.

Namost meglestem a doksit és azt írja, hogy a private-ként definiált cuccokat nem látja az öröklő osztály. Viszont nálam minden gond nélkül működik a dolog. Tehát van egy private-ként definiált változó (természetesen kezdőkértékkel), amit a származtatott osztály szépen lát, pedig a doksi szerint nem kellene.

Most akkor itt mi van?

Ps.: PHP 5.2.1-en próbáltam
 
1

Valóban nem látható

Max Logan · 2007. Nov. 8. (Cs), 16.27
Bocsi, rosszul próbáltam ki. Valóban nem látható, ha az öröklő osztályból hívom meg a private változót.

Én úgy próbáltam ki, hogy definiáltam egy metódust az ős osztályban, majd meghívtam az öröklő osztályt. Namost mivel nem definiáltam felül a hívó függvényt az öröklő osztályban, ezért elérte a private változót. Ha ugyanazt a metódust átmásoltam az öröklő osztályba - lényegében felüldefiniáltam, de ugyanaz maradt - akkor már nem látja.

Ennek nem úgy kellene működnie, hogy akkor sem érhető el a private változó, ha nem definiálom felül az ős osztály (hívó) metódusát?

UpDate: Ha ez így műxik jól, akkor mi értelme van a private láthatóságnak (mert nekem így nem egészen tiszta)
2

Így kell

kicsy · 2007. Nov. 8. (Cs), 18.16
Ha nem így működne, akkor nem lenne értelme a private láthatóságnak, hiszen csak az ős-osztályból férnél hozzá, ami a gyakorlatban az esetek nagy részében absztrakt osztály -> nem használnád soha.
Így az ősosztály metódusai biztonságosan elérik a private változójukat, mivel a többi metódus nem piszkálhat bele.
3

Mások nem látják

Poetro · 2007. Nov. 9. (P), 02.59
Egy tulajdonság vagy metódus láthatóságát közvetlenül a deklaráció előtt kell megadni a public, protected vagy privát kulcsszavakkal. A publikusként (public) deklarált elemek bárhonnan elérhetőek. A védetteket (protected) csak az öröklő és szülő osztályokból lehet elérni (és abból az osztályból, amelyik definiálja az elemet). A privát (private) láthatóságúakat csak a definiáló osztály éri el.
4

Ezt nem értem ...

Max Logan · 2007. Nov. 9. (P), 09.12
A privát (private) láthatóságúakat csak a definiáló osztály éri el.

Igen, de meg mégse, mert az öröklő osztály is eléri, ha nem definiálom felül a szülő osztály metódusát (public-ként van definiálva), ami eléri a private változót.

Nekem ez eléggé logikai csavar, hogy csak a szülő osztály fér hozzá, de az öröklő osztályból is. Szóval olyan, mintha a leszármazott osztály kicsit skizofrén lenne, a szülő és a leszármazott osztály egyszerre.
5

Ős éri el

Török Gábor · 2007. Nov. 9. (P), 12.29
Ahogy fennebb is írták, nem a gyerek fér hozzá közvetlenül. A gyerekből hívod meg az ős egy olyan metódusát, amely privát adattaggal dolgozik. Ettől függetlenül a gyerekben egyik metódusod sem fogja tudni lekérdezni az értékét, és nincs lehetőséged semmilyen módon sem változtatni azon. Egyedül az ős a saját metódusában definiált viselkedés szerint tud vele dolgozni. Ha nem te írtad az őst, fogalmad sincs adott esetben arról a privát változóról.
6

Így már kezdem érteni a dolgokat

Max Logan · 2007. Nov. 9. (P), 12.55
Akkor kb. arról van szó, mint JS esetén, hogy van egy öröklési lánc (nagyon durván fogalmazva). Én úgy értelmeztem az öröklést, hogy minden ami jön az ősből az a leszármazotté, csak adott esetben megváltozhat bizonyos része (polimorfizmus), és még ki is egészülhet új dolgokkal a leszármazott osztály.

Tehát én az öröklést nem egy láncként fogtam fel, hanem, hogy vmi jön az ősből, de onnantól köze nincsen az ős osztályhoz, ergó egy különálló egységet képez a leszármazott osztály. De ezek szerint a valós működés nem ilyen. Még barátkoznom kell ezzel az öröklési logikával ...
7

Gyakorlati példa

Max Logan · 2007. Nov. 15. (Cs), 15.26
Tudna vki mondani egy gyakorlati példát, hogy miért jó az, hogy az ős objektumból lehet használni vmit, de a leszármazottból már nem (private láthatóság)?
8

Fekete doboz

Poetro · 2007. Nov. 15. (Cs), 22.38
Neked nem kell tudni, hogy milyen változók vannak az ős objektumban, csak elég a publikus, vagy protected változókhoz hozzáférni. Ha jól tudom, akár ugyanolyan neven létre is hozhatsz változókat, nem fog problémát okozni. Akár zárt kódot is feltétlezhetnénk ilyen téren mint például a Win32 API, aminek te csak a függvénydeklarációját ismered, de hogy belül hogyan működik azt nem (és általában jobb is ha nem tudja az ember).