Kezdőoldal » Számítástechnika » Programozás » PHP OOP-val kapcsolatban mit...

PHP OOP-val kapcsolatban mit jelent a $this->? Egyszerűen nem bírom megérteni.

Figyelt kérdés

A könyvemben az szerepel, hogy a $this nevezetű változót arra használjuk, hogy egy objektum információt szerezhessen önmagáról.


Viszont ilyen esetben miért nem írjuk ki a $this helyére az objektum nevét?


Pl:

*** osztalyDemo.php


<?php

class Demo {

public $nev;

function koszontes() {

print "Hello $this->nev!";

}}

?>

*** Demo.php


<?php

require_once('osztalyDemo.php');

$objDemo = new Demo(); // létrehozok egy új Demo típusú objektumot

$objDemo->nev ='Steve'; // Az objektum tulajdonságának értéket állítok be


$objDemo->koszontes();

?>


Itt is látható, hogy amikor az objektum meghívja a koszontes metódust, akkor a metóduson belül felesleges a this. Valaki elmagyarázná nagyon egyszerű módon, hogy mikor is van ennek ténylegesen értelme?


2016. júl. 4. 13:09
 1/4 anonim ***** válasza:

Üdv.


Az $this-> - egy konkrét objektum egy létrehozott példányának egy tulajdonságára vagy viselkedésére utal.

Ha van pl egy Autó osztályod ,amelyből létrehozol rendre a1,a2,a3...an példányt azoknak a tulajdoságai megegyeznek,de a tulajdonságok értékei nem feltétlenül.


Az $this-> egy adott példány tulajdonságára,metódusára vonatkozik és nem a többire.


Az $this-> alapértelmezetten is fenn áll egyszerű metódusok és tulajdonságok esetén,DE a thist STATIC metódusnál vagy tulajdonságnál nem alkalmazhatod.


A statikusok egy objektum család MINDEN tagjára érvényes lehet. A $this-> -el minden létrehozott példány egyedi lehet.


abstract class Auto

{

protected $szin;

protected static $marka;

protected $sebesseg;


}

class BMW extends Auto{


function __construct($szin,$sebesseg)

{

//minden példánynak egyedi a tulajdonsága-egyre igaz amelyet létre hozol $this

$this->szin = $szin;

$this->sebesseg = $sebesseg;

//statikus - ez minden példányra igaz lesz vannak úgynevezett Osztályszintű és példány szintű tagok,a static

//az osztály szint, a $this pedig példány szintű

self::$marka = "BMW";

}

public static function getMarka()

{

return self::$marka;

}

function toString()

{

echo "Márka : ".self::$marka."<br/>Szin: ".$this->szin."<br/>Sebesség: ".$this->sebesseg."<br/>";

echo "<hr/>";

}

}

$bmw1 = new BMW("Zöld",200);

$bmw2 = new BMW("Piros",200);

$bmw3 = new BMW("Szürke",200);

$bmw1->toString();

$bmw2->toString();

$bmw3->toString();

2016. júl. 4. 13:26
Hasznos számodra ez a válasz?
 2/4 anonim ***** válasza:

Na várj. Ezt az OOP dolgot képzeld el egy kicsit másképp.


Amikor objektumorientáltan programozunk, olyan, mintha két világunk lenne. Van egyszer a mi való világunk, amelyben élünk, és van a programunk világa, amit most képzelj el teljesen üresnek. Vannak nekünk tárgyaink a mi világunkban, amelyben élünk. Ilyenek pl. a lámpák, a székek, stb. (csak hogy egyszerűeket nézzünk). Azt akarjuk elérni, hogy ezek a tárgyaink a programunk világában is benne legyen. Erre lesz jó az osztály - ugyanis ebben tudjuk leírni a tárgyunk nevét, azt, hogy milyen tulajdonságai legyenek, miket tudjon csinálni és hogyan.


Nem akarom túlságosan elvinni a szót, de egy kicsit ki kell térnünk arra, hogy mi is az a modellezés. A lényege az volna, hogy készítünk egy rendszert. A mi világunkban vannak olyan tárgyak, amelyek a rendszer szempontjából fontosak, és vannak olyanok, amelyek nem. Így első lépésként kiválasztjuk azokat, amik nekünk kellenek. Például, ha csinálunk egy könyvtári rendszert, akkor fontos lesz nekünk a könyv, a szerző (mint ember), a kikölcsönző (mint ember), az olvasójegy, stb.

Viszont ha megnézzük, ezeknek a dolgoknak is vannak olyan tulajdonságaik és tudnak olyan dolgokat csinálni, amelyek a rendszer számára fontosak, és tudnak olyat is, amelyek nem fontosak. Például a kikölcsönző személynek fontos lesz a neve, a lakcíme, a személyi azonosító száma, a születési dátuma és helye, tudnia kell kikölcsönözni egy könyvet, de nem lesz fontos a hajának és a szemének a színe, a testtömege, stb. Második lépésben ezeket szűrjük ki.

Így most, hogy megtudtuk, hogy a rendszernek mire van szüksége, ezeket osztályok segítségével átemelhetjük a mi világunkból a programunk világába.


És most jön a lényeg, amire olyan nagyon kíváncsi vagy. A modellezés során felfigyelhetsz olyan tulajdonságokra és viselkedésekre, amelyek konkrét objektumokra (az objektum egy adott osztálynak a példánya) vonatkoznak, és vannak olyan tulajdonságok és viselkedések, amelyek bár egy konkrét példányra sem vonatkoznak, hanem általánosságban beszélnek róluk. Ez így előfordulhat, hogy bonyolult megérteni, de itt egy példa:

Adva van a szék osztály. Példányosítás során lett nekünk:

1) Fából készült, barna színű, háttámlával és kartámasszal rendelkező szék,

2) Műanyagból készült, szürke színű, háttámlás, de kartámasz nélküli szék,

3) Fából készült, kék színű, háttámla és kartámla nélküli szék.

Tehát egy szék készült valamilyen anyagból, le lett festve valamilyen színűre, lehet háttámlája és kartámasza. De ezek székenként eltérnek - tehát magukra a példányokra vonatkoznak. Ezeket hívjuk példányszintű tagoknak.


Viszont tudunk olyan tulajdonságot is mondani, ami egyik konkrét székre sem vonatkozik, hanem általánosabban beszél a székekről. Például, hogy hány szék van a világban. Ez a tulajdonság se az elsőre, se a másodikra, se a harmadikra nem vonatkozik, mégis a székekről szól, ezért kapott a szék osztályban helyet. Az ilyen tulajdonságokat és viselkedéseket hívjuk osztályszintű, vagy más néven statikus tagnak.


class Szék {

.. public $Anyag;

.. public $Szin;

.. public $Hattamlas;

.. public $Kartamasz;

..

.. public static $SzekekSzama = 0;

..

.. public function __construct($a, $sz, $h, $k) {

.. .. $this->Anyag = $a;

.. .. $this->Szin = $sz;

.. .. $this->Hattamlas = $h;

.. .. $this->Kartamasz = $k;

.. ..

.. .. self::SzekekSzama++;

.. }

}


Amikor az osztály egy metódusában példányszintű tagot akarunk elérni, akkor azt a $this példányon keresztül érhetjük el. Ha osztályszintű tagról van szó, akkor a self:: vagy a static:: minősítőt használhatjuk (van különbség a kettő közt).

2016. júl. 4. 13:49
Hasznos számodra ez a válasz?
 3/4 A kérdező kommentje:
Nagyon köszönöm a 2 tartalmas választ, mindkettő hozzájárult a sikeres megértéshez!
2016. júl. 4. 14:34
 4/4 anonim ***** válasza:
OOP, OOP, OOP... OOPan Gangnam Style
2016. júl. 4. 14:38
Hasznos számodra ez a válasz?

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!