OOP

Absztrakt osztály, interfész és trait-ek közti különbségek

cikk borítókép

Tegye fel a kezét, aki még nem bizonytalanodott el abban, hogy mikor nyúljon absztrakt osztályhoz és mikor interfészhez! Annak ellenére, hogy a különbséget általában mindenki érti vagy érteni véli, mégis néha felcserélhetőnek tűnik a kettő. És ez pedig csak bonyolódott PHP-ben, mióta megjelentek a trait-ek, amik sok esetben nagyon vonzónak tűnnek. Ezekről mind írtam 2011-ben egy összefoglaló cikkben, amit szintén érdemes elolvasni, de vajon mikor, melyiket kell alkalmazni a gyakorlatban? Ezt igyekszem tisztázni ebben a cikkben.

Megosztás/Mentés

PHP jelentősebb változásai napjainkig - Kezdetektől a trait-ekig

Emlékszem, mikor még a PHP 4 volt számomra az egyetlen verzió. Majd igen késve belekóstoltam a PHP 5-be és tetszett, amit láttam. Azóta is folyamatosan fejlődött. Kapott új függvényeket is, de mégsem volt olyan látványos a változás. Hozzáteszem, a unicode változónevek használata sem jelentéktelen, ami már 5.3 előtt is létezett, de a valódi haszna mégis megkérdőjelezhető. Majd az 5.3 -as verzióban többek között bevezették a névtereket. Persze nem nagyon volt még akkor olyan szerver, ahol ez a verzió futott volna. És mivel névterek nélkül is jól megvoltam addig, ezt a funkciót inkább nem is használtam. De az idő nem állt meg és elértünk az 5.2-es széria támogatottságának végéig. Amikor már mindenkit az 5.3-ra való átállásra ösztönöznek a PHP nyelv fejlesztői. Egyelőre még mindig több szerveren csak 5.2 van. Többek között a rimelek.hu szolgáltatóján is. Tervezik viszont ők is, hogy bevezetnek 5.3-as szervert is, amire kérésre át lehet majd kerülni. Van ingyenes szolgáltató, ami már korábban váltott. Ilyen a Freeweb.hu is. Lehet több is van. Nem néztem utána. Már 5.3.8 -nál tart ez a széria. És bár korábban sokan hallhattak a 6-os verzióról, a következő az 5.4 lesz.

A PHP 5.4 ismét olyan újításokat vezet be, ami miatt megint lehet egy kicsit dicsérni a nyelvet. De hogyan jutottunk ide?

Megosztás/Mentés

Perzisztens PHP objektumok - R.E. DBObjects v2.1

Ez az osztálykönyvtár perzisztens megvalósítását teszi lehetővé PHP osztályoknak. Ezen kívül tartalmazza az R.E. Pagination néhány funkcióját, hogy a perzisztens objektumokat tartalmazó listát is lehessen inicializálni oldalanként.

R.E. DBObjects letöltése
Dokumentáció letöltése
Dokumentáció megtekintése

Előnyei

  • Frissítésnél és törlésnél nincs szükség sql kódok írására.

  • Az egyes adatbázis mezők objektum tulajdonságként kezelhetők. Így akár osztályon belül módosítható is az elérésük __get __set metódusokkal.

  • Egyedi metódusok definiálhatók a jellemzők kezelésére.

  • A kódolás egyszerűbb, gyorsabb, átláthatóbb.

Hátrányai

  • Összetett kulcsokat még nem tud kezelni.

  • Minden táblának tartalmaznia kell auto_increment elsődleges kulcsot.

  • A frissítés, törlés, lekérdezés valamivel lassabb lehet. Ez nyilvánvalóan adódik az előnyök megvalósításának idejéből.

  • Még nem képes több adatbázis kapcsolat egyidejű kezelésére

Példa a használatára:

<?php
//Ennek az osztálynak includeolása szükséges egyedül.
require_once 'REDBObjects/REDBObjects.class.php';
//Az összes mysql modult betölti a könyvtárból.
REDBObjects::uses('mysql');

mysql_connect('localhost', 'root', 'password');
mysql_select_db('teszt');

$list = new IsMySQLListClass(array(
        'teszt'=>array('*')
));
$list->tableName_signal = 'T_'; //Ez az alapértelmezett is
$list->table_field_sep = '__'; //Az alapértelmezett az egy darab _ jel
//sql kód FROM utáni részét kell megadni limit nélkül.
//Plusz hogy hány rekordot kérdezzen le egy oldalra
$list->page("teszt where field like 'A%'", 10);
foreach ($list as $key => $object)
{
        print $object->T_teszt__id.', '.$object->field.'<br />'.PHP_EOL;
        if ($object->id == 2)
        {
                //Frissíti a field tulajdonság értékét.
                $object->field = 'P';
                $object->update();
        }
}
?>

Megosztás/Mentés

Rugalmas nyelvkezelés

Gyakran van szükség arra, hogy egy weboldalt több nyelven jelenítsünk meg.
Ennek ma már több formája is létezik. Az egyik, amikor minden nyelvnek külön fájlt hozunk létre egy languages mappában, és abban egy asszociatív tömbben felsoroljuk az egyes tartalmakat.
Ezzel a módszerrel mutatom meg, hogyan lehet úgy kezelni a nyelveket, hogy amennyiben az alapértelmezett nyelven minden szöveg definiálva van, azon a nyelven jelenjen meg a tartalom, ha a kiválasztott nyelven nem létezik még, vagy szándékosan nem definiáltunk egy értéket. Esetleg maga a nyelv sem létezik, amit megadtunk.

Megosztás/Mentés