Kezdőoldal » Számítástechnika » Programozás » PHP OOP osztalynal mi kulonbse...

PHP OOP osztalynal mi kulonbseg a 2 dolog kozott?

Figyelt kérdés

SZoval van egy Teglalap osztalyunk, a es b oldallal. Ez a két értékbeállitásmód között mi a különbség? és melyiket kell használni??

1. : public $b;


2. : public function getB() {return $this->b;}

public function setB() { $this->b = b; }



Egymás nélkül, és együtt is működnek..Ugyanúgy kiirja ha , $teglalap->b; vagy $teglalap->getB();


2014. jún. 2. 19:57
1 2
 1/12 anonim ***** válasza:
Általános OOP kérdésnek tűnik a dolog. Alapvetően változókat nem illik közvetlenül manipulálni a saját osztályán kívülről, ha szépen akarod csinálni, akkor a változóknak privátnak kéne lenniük, amiket a publikus getB és setB függvényekkel lehet elérni/módosítani (lásd OOP elméleti alapok és elvek :) ).
2014. jún. 2. 20:38
Hasznos számodra ez a válasz?
 2/12 anonim ***** válasza:

PHP-ban működik, ráadásul az alap láthatóság is public, szóval valóban elhagyható az 1. pontban említett rész.

Ugyanakkor nem túl szép megoldás.

2014. jún. 2. 22:46
Hasznos számodra ez a válasz?
 3/12 anonim ***** válasza:
Nem csak PHP-ban működik, a legtöbb nyelv engedi, csak az OOP zártsági elveinek nem igazán felel meg ugye. :)
2014. jún. 2. 22:47
Hasznos számodra ez a válasz?
 4/12 anonim ***** válasza:

"a legtöbb nyelv engedi"


Ezt nem mondanám. Ez csak a gyengén típusos scriptnyelvekre jellemző dolog.

2014. jún. 2. 23:20
Hasznos számodra ez a válasz?
 5/12 anonim ***** válasza:
C#, Java, C++? Ezekben mindben tudsz tudtommal publikus változókat deklarálni az osztályodban, és egy másik osztályból közvetlenül hivatkozni az adott objektumod ezen publikus változóira (és változtatni is őket persze).
2014. jún. 2. 23:29
Hasznos számodra ez a válasz?
 6/12 anonim ***** válasza:
Igen, de a kérdésben pont arról volt szó, hogy az 1. pontban szereplő deklarációt elhagyva is működik a kód, ami a java, C++, C# stb.. esetén hibát eredményez.
2014. jún. 2. 23:32
Hasznos számodra ez a válasz?
 7/12 anonim ***** válasza:

én erről beszéltem: "Ugyanúgy kiirja ha , $teglalap->b; vagy $teglalap->getB();"

Nem vagyok egy php guru, de php-ben tényleg működik az, hogy "public function getB() {return $this->b;} ", ha b nevű változóról korábban egy büdös szó sem volt? mert az egy dolog, hogy nem kell deklarálni, de azért csak kell, hogy létezzen a változó, mielőtt megpróbáljuk visszaadni, nem?

2014. jún. 3. 00:13
Hasznos számodra ez a válasz?
 8/12 A kérdező kommentje:

Szoval akkor a 2.-at celszerubb hasznalni


Egyebkent:

"Igen, de a kérdésben pont arról volt szó, hogy az 1. pontban szereplő deklarációt elhagyva is működik a kód, ami a java, C++, C# stb.. esetén hibát eredményez."


c#-ban az 1. deklaraciot lehagyva is mukodik! 2. nelkul nem mukodik! de php-ban a 2. nelkul is mukodott, szoval azert nem ertettem mire jo a 2. akkor :/

2014. jún. 3. 00:48
 9/12 anonim ***** válasza:

@00:13: PHP-ban csak notice ha nincs deklarálva a változó.

[link]

Szóval (sajnos) megy.

2014. jún. 3. 00:56
Hasznos számodra ez a válasz?
 10/12 2xSü ***** válasza:

> de php-ban a 2. nelkul is mukodott, szoval azert nem ertettem mire jo a 2. akkor :/


Kicsit tegyük félre, hogy a te megoldásod egy kicsit hibás. a setB() metódusnak nincs paramétere. Akkor például ha van egy objektumod, ami a folyószámládat valósítja meg. Oké, van annak egy tulajdonsága, a folyószámlán található összeg. A kétféle megvalósítás akkor így néz ki:


class folyoszamla {

public $egyenleg

}


A másik:


class folyoszamla {

private $egyenleg;

public function getEgyenleg() { return $this->egyenleg; }

public function setEgyenleg($v) { $this->egyenleg=$v; }

}


Nagyszerű. Megírod az első formában, mert az úgy neked rövidebbnek tűnik. A kódodban aztán több száz helyen használod is, hogy $szamlam->egyenleg = …. Működik? Igen. Mindenki boldog és vidám, egészen addig, amíg valaki szól fentről, hogy visszaélések történtek a folyószámlákkal, kellene naplózni, hogy melyik folyószámla esetén milyen összegre változott az egyenleg. Na ekkor mondasz fel, mert végig kellene bogarászni a kódodat, hogy hol változtattál az egyenlegen, és vagy ott helyben naplózni, vagy szépen átírni a második megolásra az objektumot. Mert mi a helyzet a második megoldásnál? Azt mondod, hogy semmi gond, átírod az objektumodat:


public function setEgyenleg($v) {

naplozas("Valaki megváltoztatta az egyenleget ".$this->egyenleg." Ft-ról ".$v." Ft-ra.");

$this->egyenleg=$v;

}


Vagy amúgy használhatod a __set és __get metódusokat is, mérlegelve, hogy ettől mennyire válik átláthatatlanabbá, vagy éppen egyszerűbbé a kód.


Az OOP szemléletben nem adatokat kezelünk, hanem objektumokat. Hogy milyen műveletek kellenek az egyenleg megváltoztatásához, azt bízzuk rá az objektumunkra. Hogy ez most csak egy tulajdonság megváltoztatása, vagy valami bonyolultabb művelet is kell hozzá, az legyen az objektum belügye, ne akard ez előre mérlegelni, mert nem biztos, hogy az adott helyzet áll fenn a fejlesztés későbbi időszakában is.

2014. jún. 3. 12:16
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!