Előző heti cikkünkben elkezdtük az ismerkedést az objektumorientált programozással, bemutatva az osztályok és az objektumok alapjait. Megtanultuk az OOP definícióját, előnyeit, majd részletesen taglaltuk az osztályok és az objektumok fogalmát, számos példával illusztrálva. Mai leckénkben tovább kalandozunk az OOP világában: a konstruktorokkal, a destruktorokkal és az öröklődéssel foglalkozunk.
A konstruktorok és a destruktorok használata
Az objektumorientált programozás megkönnyítésének érdekében a PHP olyan módszereket is igénybe vesz, amelyek meghatározott akciók esetén az objektumon belül automatikusan lefutnak.
Az egyik ilyen módszer a __construct() (mely konstruktor néven ismert). Ez minden alkalommal automatikusan lefut, amikor új objektumot hozunk létre. Ehhez hasonló módon a __destruct() (azaz a destruktor) akkor fut le automatikusan, ha megsemmisítünk egy objektumot. A destruktor funkció minden olyan erőforrást „eltakarít” az objektum megsemmisítése után, amely az objektumhoz volt rendelve. Lássunk egy példát a két módszer működésére!
PHP-kód:
<?php
class MyClass
{
// Konstruktor
public function __construct() {
echo 'A "' . __CLASS__ . '" osztály létrejött!<br />';
}
// Destruktor
public function __destruct(){
echo 'A "' . __CLASS__ . '" osztály megsemmisült.<br />';
}
}
// Új objektum létrehozása
$obj = new MyClass();
// Üzenet a fájl végén
echo 'A fájl végéhez érkeztünk.';
?>
Megjelenítés a böngészőben:
A „MyClass” osztály létrejött!
A fájl végéhez érkeztünk.
A „MyClass” osztály megsemmisült.
A destruktor automatikusan lefut, amikor a script véget ér. Ahhoz azonban, hogy külön, még a script vége előtt beindítsuk a destruktort, segítségül hívhatjuk a PHP unset() funkcióját, ahogyan azt az alábbi példa is mutatja.
PHP-kód:
<?php
class MyClass
{
// Konstruktor
public function __construct() {
echo 'A "' . __CLASS__ . '" osztály létrejött!<br />';
}
// Destruktor
public function __destruct() {
echo 'A "' . __CLASS__ . '" osztály megsemmisült.<br />';
}
}
// Új objektum létrehozása
$obj = new MyClass();
// Objektum megsemmisítése
unset($obj);
// Üzenet a fájl végén
echo 'A fájl végéhez érkeztünk.';
?>
Megjelenítés a böngészőben:
A „MyClass” osztály létrejött!
A „MyClass” osztály megsemmisült.
A fájl végéhez érkeztünk.
A PHP automatikusan „feltakarít” minden kapcsolódó erőforrást, miután a script lefut — például lezárja az adatbázis-kapcsolatokat, megsemmisíti az objektumokat, stb.
Fontos megjegyezni, hogy a __CLASS__ egy magic constant (ezekkel korábbi leckéink egyikében ismerkedhettél meg), mely annak az osztálynak a nevét tartalmazza, amelyben előfordul. Ha az osztályon kívül jelenik meg, üres lesz.
Az osztályok származtatása az öröklődés révén
Az osztályok örökölhetik egy másik osztály tulajdonságait és módszereit. Ehhez az extends kulcsszót hívhatjuk segítségül. A származtatás folyamatát öröklődésnek nevezzük, s ez az egyik legnyomósabb érv, mely az objektumorientált programozás használata mellett szól.
Mutatunk is egy példát:
PHP-kód:
<?php
// Az osztály definíciója
require 'Rectangle.php';
// Új osztály definiálása a már létező osztály alapján
class Square extends Rectangle
{
// Módszer arra, hogy ellenőrizzük, hogy a négyszög kocka-e
public function isSquare() {
if ($this->length == $this->width) {
return true; // Kocka
}
else {
return false; // Nem kocka
}
}
}
// Új objektum létrehozása a Square osztályból
$obj = new Square();
// Az objektum tulajdonságai értékének beállítása
$obj->length = 20;
$obj->width = 20;
// Az objektum módszereinek lehívása
if ($obj->isSquare()) {
echo 'A négyzet területe ';
}
else {
echo 'A négyszög területe ';
}
echo $obj->getArea();
?>
Megjelenítés a böngészőben:
A négyzet területe 400
Amint az a fenti példán is megfigyelhető, a Square osztály definíciója nem tartalmazza a getArea() módszert, sem a $length és $width tulajdonságokat, a Square osztály elemei mégis használhatják őket, hiszen örökítve lettek a szülő Rectangle osztályról.
Plusz egy tipp: Mivel a gyermek osztály a szülő osztályból lett levezetve, derivált osztálynak is nevezzük, míg a szülő osztály neve az alaposztály.
Összegzés:
Mai leckénkbe ennyi fért bele. Megismerkedhettél a konstruktorokkal és a destruktorokkal, melyek az objektumorientált programozás mágikus módszereinek számítanak, és jelentősen megkönnyíthetik a programozó dolgát. Cikkünk második részében az osztályok származtatásával foglalkoztunk, és egy egyszerű példával be is mutattuk a tulajdonságok örökítését a gyakorlatban. Már csak annyi maradt hátra, hogy gyakorold a ma tanultakat, hiszen a jövő héten folytatjuk az OOP taglalását — szó lesz a tulajdonságok és a módszerek láthatóságáról, valamint a statikus tulajdonságokkal és módszerekkel is megismerkedünk majd.
Nyereményjáték
Rovatunk elsődleges célja, hogy közelebbről is bemutassa a legismertebb webtechnológiákat. Azok között az olvasók között, akik minden héten követik rovatunkat, azaz velünk tanulják a programozás alapjait és kitöltik a feladatsort, a sorozat végén egy laptopot sorsolunk ki.
A játék heti kérdése:
Mikor fut le egy objektum __construct() metódusa?
A választ a tanulok@erdsoft.com e-mail-címre kell elküldeni, a tárgysorba pedig a következőt kell beírni: HÉTNAP-TANULOK. Sok szerencsét!
Néhány szó rólunk:
Az ErdSoft (www.erdsoft.com) 2011-ben alakult meg. Csapatunkat a fiatalos lendület, a szakértelem, a folyamatos tanulás és tapasztalatgyűjtés jellemzi. Ügyfeleinknek igyekszünk teljes körű szolgáltatást nyújtani — bátran fordulhatnak hozzánk, legyen szó webfejlesztésről, alkalmazásokról, SEO-optimalizálásról, grafikai tervezésről, marketingről vagy szövegírásról. Csapatunk sikerét mi sem bizonyítja jobban, mint a több száz elkészült weboldal és a számos elégedett ügyfél Szerbiában, Magyarországon és az Egyesült Királyságban.