Megérkeztünk cikksorozatunk negyedik részéhez, melyben be is fogjuk fejezni az alapozást, a következő cikkben már ténylegesen elkezdjük a weboldalunk felépítését - mely közben azért még néhány dolgot meg fogunk ismerni. Amennyiben az előző részeket nem olvastad, akkor megtalálhatod azokat a további részek című oldalrésben.
Mostani cikkünkben két dologgal fogunk megismerkedni, első körben a magic methods-okkal találkozhatunk, majd szót ejtünk az öröklődésről is.
Magic methods
Az elnevezésből arra következtethetnénk, hogy ezek valamilyen módon a többi közül kilógó, különleges függvények lesznek - és tényleg erről van szó! Ezek megismerése nagyon egyszerű, mivel minden esetben "__" prefixxel kezdődnek. Ha most ez a jel valahonnan ismerősnek tűnik, akkor gratulálok - az előző részekben jól figyeltél! a__construct és a __destruct függvényeket már eddig is használtuk, és különlegességük az volt, hogy ezeket a függvényeket sosem hívtuk meg a kódból, mégis lefutottak - a construct az osztály példányosításakor (az osztályból egy objektum létrehozásakor), a destruct az objektum megszűnésekor futott le. Viszont még létezik más ilyen függvény is, első körben nézzünk is egy példát egy osztályra:
class logEverything{
public $veryImportantVariable = 2;
private $log = array();
public function __construct(){
$this->log[] = 'Létrejöttem';
}
public function __destruct(){
$this->log[] = 'Megszűntem';
//save log to database
}
public function printLog(){
print_r ($this->log);
}
}
//test code:
$test = new logEverything();
echo $test->veryImportantVariable;
$test->veryImportantVariable = 10;
echo $test->veryImportantVariable;
$test->printlog();
Tehát a fenti példánkban egy olyan osztályunk van, ahol minden elvégzett műveletet / változást menteni szeretnénk, majd végre is hajtunk műveleteket - változó értékét akarjuk módosítani. (A példakódunk értelmességét most nem érdemes vizsgálni, természetesen ez az osztály soha nem lesz megtalálható semmilyen programban - lévén, hogy ténylegesen semmit sem csinál, így semmire sem jó.)
A programunk működik is, csak éppen a log tömbben a módosításokról és kiíratásról semmilyen információnk nem lesz, abban csak az objektum létrejötte és megszűnése fog szerepelni. Viszont van néhány, beszédes elnevezésű Mmagic methodunk: __get, __set, __isset, __unset. Próbáljuk is ki őket:
class logEverything{
public $veryImportantVariable = 2;
private $log = array();
public function __construct(){
$this->log[] = 'Létrejöttem';
}
public function __destruct(){
$this->log[] = 'Megszűntem';
//save log to database
}
public function __get($var){
$this->log[] = 'Get: '.$var;
return $this->$var;
}
public function __set($var,$value){
$this->log[] = 'Set: '.$var;
$this->$var = $value;
}
public function __unset($var){
$this->log[] = 'Unset: '.$var;
unset($this->$var);
}
public function printLog(){
print_r ($this->log);
}
}
//test code:
$test = new logEverything();
echo $test->veryImportantVariable;
$test->veryImportantVariable = 10;
echo $test->veryImportantVariable;
$test->printlog();
Ezek után megnézve a log-ot meglepve tapasztalhatjuk, hogy semmi változás! Ennek oka az, hogy ezek a függvények csak akkor futnak le, ha olyan változóhoz szeretnél hozzáférni ami nem hozzáférhető számodra, vagy nem is létezik. A nagyonfontos változó privátra állításával viszont ellenőrizhetjük forráskódunk helyességét:
class logEverything{
private $veryImportantVariable = 2;
private $log = array();
public function __construct(){
$this->log[] = 'Létrejöttem';
}
public function __destruct(){
$this->log[] = 'Megszűntem';
//save log to database
}
public function __get($var){
$this->log[] = 'Get: '.$var;
return $this->$var;
}
public function __set($var,$value){
$this->log[] = 'Set: '.$var;
$this->$var = $value;
}
public function __unset($var){
$this->log[] = 'Unset: '.$var;
unset($this->$var);
}
public function printLog(){
print_r ($this->log);
}
}
//test code:
$test = new logEverything();
echo $test->veryImportantVariable;
$test->veryImportantVariable = 10;
echo $test->veryImportantVariable;
$test->printlog();
Ezen módosítás után a kódunk már úgy működik, ahogy elterveztük. Ezek után az alábbi kód, elsőre érdekes kimenete is teljesen megmagyarázható lesz:
class test{
private $a = 2;
public $b = 2;
public function __get($g){
return 1;
}
}
$test2 = new test();
echo $test2->a;
echo $test2->b;
Ezen kívül még léteznek más magic method-ok is, de ezek után azok működései dokumentáció alapján is könnyen megérthetőek - úgyhogy rá is térhetünk cikkünk második témájára:
Öröklődés
Öröklődés esetén egy osztályunkat egy másik, úgynevezett leszármazott osztály által használunk.
Például ha egy weboldalon írunk egy osztályt általánosan a bejegyzések kezelésére (mely definiálja például a listázáskor egy oldalon megjelenő bejegyzések számát, azok lapozásához szükséges funkciókat), és ennek leszármazott osztálya(i) lehet(nek) az(ok) az osztály(ok), mely(ek) az egyes bejegyzésfajták speciális tulajdonságaihoz szükséges lehetőségeket tárolják (például a tartalmak megfelelő adatbázisból való lekérése, mely más például cikkek, zenék és filmek esetén is).
class contents{
protected $maxNumberInOnePage = 10; //protected, not private
public function pageTurner($numbersOfContents,$currentPage=1){
//do dometing
$maxpage = ceil($numbersOfContents/$this->maxNumberInOnePage);
echo 'Lapozó helye.. '.$currentPage.' / '.$maxpage.'
';
}
}
class articles extends contents{
public function selectContents($from){
//do dometing
$to = $from + $this->maxNumberInOnePage;
echo 'cikkek '.$from.'-tól '.$to.'-ig.
';
}
}
$articles = new articles();
$articles->selectContents(10);
$articles->pageTurner(34,2);
Ezzel cikksorozatunk negyedik részének végéhez értünk. A folytatásban elkezdjük felépíteni egyszerű weboldalunkat, miközben még tovább mélyítjük az objektum orientált programozással kapcsolatos tudásunkat.
Hozzászólások
-