Objektinis programavimas ir PHP
Parašė N3PST3R 2006 spalio 26 21:10:51
Objektinis programavimas ir PHP

Kai pradėjau domėtis PHP, turbūt vienintelis dalykas, kurio ilgą laiką negalėjau perprasti buvo objektinis programavimas. Deja, galutinai neperpratau iki šiol, tačiau pasistengsiu pasidalinti iki šiol įgyta patirtimi.
Dabar siūlau susipažinti su pagrindiniais objectinio programavimo terminais:
Klasė - tai rinkinys funkcijų ir kintamųjų, bendradarbiaujančių tarpusavyje.
Savybės - tai klasėje naudojami kintamieji.
Metodai - tai klasėje naudojamos funkcijos.
Konstruktorius - tai funkcija įvykdoma sukuriant klasę (sukuriant objektą).
Iš šių painių apibrėžimų sunku ką nors suprasti. Bet manau, jog perskaitę šį straipsnį susidarysite bent minimalų vaizdą apie objektinį programavimą (OOP - Object Oriented Programming).

Taigi, pradėkime nuo sintaksės. Klasės aprašomos naudojant operatorių Class. Klasių kodas rašomas tarp riestinių skliaustų, lygiai kaip ir aprašant paprastas funkcijas:

<?
<span style='color:green;'>class klase{</span>
// čia aprašomos objekto savybės
var $savybe1;
var $savybe2;

// čia aprašomi metodai
function metodas($kint)
{
// kodas
}
}
?>

Kaip matome, savybės yra aprašomos naudojant operatorių var. Dabar pateiksiu pavyzdį iš realaus gyvenimo, kurį būtų galima susieti su OOP. Automobilis. Tai bus mūsų objektas. Kaip žinome jis turi keletą savybių: spalvą, formą, dydį, galią ir t.t. Tai bus mūsų objekto savybės. Taip pat jis gali atlikti keletą veiksmų: pajudėti iš vietos, pasukti, sustoti, važiuoti. Visa tai bus objekto metodai. Dabar visa tai aprašykime PHP kodu:

<?
class automobilis
{
// automobilio savybes
var $pavadinimas;
var $spalva;
var $forma;
var $dydis;
var $galia;

function pajudeti()
{
// kodas
}

function sustoti()
{
// kodas
}
function vaziuoti($greitis)
{
//kodas
}
function pasukti($kampas)
{
// kodas
}
}

?>

Kaip matome, viskas pakankamai paprasta. Taigi dabar panaudosime šį objektą. Sukurkime keletą automobilių:

<?
// sukuriame mano automobilį
$mano=new automobilis;
$mano->pavadinimas="BMW";
$mano->spalva="Juoda";
$mano->galia="200 AG";

// sukuriame jos automobilį
$jos=new automobilis;
$jos->pavadinimas="Ferrari";
$jos->spalva="Raudona";
$jos->galia="300 AG";

// na, o dabar mamo automobilis turėtų pajudėti iš vietos
$mano->pajudeti();
// o dabar padidinti greitį iki 150 km/h
$mano->vaziuoti(150);

// o, štai atlekia jos automobilis
$jos->vaziuoti(180);

// o ne, keliu policija.........
$mano->sustoti();

?>

Naujas objektas sukuriamas panaudojant operatorių new. Kintamajam priskiriama "object" tipo reikšmė, taip paverčiant jį objektu. Panaudojant -> (priešingai ne JavaScript ir kt.) mes galime pasiekti visas objekto savybes ir metodus. Reikšmių priskyrimas objekto savybėms yra identiškas reikšmių priskyrimui kintamiesiems.
Naudojant OOP dažnai reikia keisti objekto savybių reikšmes pačios klasės viduje. Tam yra naudojamas išskirtas kintamasis $this, nurodantis, jog savybė priklauso esamai klasei.

<?
class automobilis
{
var $pavadinimas;
var $spalva;
// ............. kitos savybes ............

function perdazyti($spalva)
{
$this->spalva=$spalva;
}
}

$auto=new automobilis;
$auto->spalva="Raudona";
$auto->perdazyti("Juoda");
?>

Panaudojant $this galima ne tik naudoti objekto "vietines" savybes. Taip pat galima vykdyti ir metodus.
Na, o dabar pavyzdys iš praktinio klasių pritaikymo: sukursime klasę, kuri sukurs HTML lentelę, su nurodytu skaičiumi eilučių ir stulpelių.

<?
class lentele
{

var $eil;
var $stulp;

// nurodyti eilučių ir stulpeių skaičių
function nustatyti($eil, $stulp)
{
$this->eil=$eil;
$this->stulp=$stulp;
}

// sukurti lentelę
function kurti_lentele()
{
echo "<table border=1>";

for ($x=1; $x<=$this->eil;$x++)
{
echo "<tr>";
for ($y=1; $y<=$this->stulp;$y++)
{
echo "$x, $y";
}
echo "</tr>";
}
echo "</table>";

}

}
?>

Šioje klasėje yra du metodai: nustatyti(), kuris nurodo, kiek eilučių ir stulpelių turės lentelė, ir kurti_lentele(), kuris atvaizduoja lentelę pagal nurodytus duomenis. Štai panaudojimas:

<?
$obj=new lentele;
$obj->nustatyti(2,3);
$obj->kurti_lentele();
?>

OOP taip pat galima aprašytiyti funkciją, kuri bus vykdoma sukuriant objektą. Tokia funkcija vadinama konstruktoriumi ir turi turėti tokį pat pavadinimą, kaip ir klasė.
Pavyzdžiui, papildysime lentelės klasę funkcija, kuri priskirs reikšmes kintamiesiems pagal nutylėjimą.

<?
class lentele
{
var $eil;
var $stulp;

// dabar reikia konstruktoriaus
function lentele()
{
$this->eil=5;
$this->stulp=3;
}
}
//kitos funkcijos
?>

O dabar galime kurti lentelę, nenurodinėdami parametrų:

<?
$lent=new lentele;
$lent->kurti_lentele();
?>

Įvykdę šį kodą gausime 5x3 lentelę.

Na, ir galiausiai papasakosiu apie vieną iš svarbiausių OOP galimybių - plečiamumą ir paveldimumą. Tai yra labai paprasta: paprasčiausiai sukuriame klasę, kuri išplečia jau esamą ir paveldi jos metodus, savybes.
Išplėsti jau esamai klasei yra naudojamas operatorius "extends". Taigi dabar išplėsime lentelės klasę:

<?
class lentele
{

var $eil;
var $stulp;
var $krastine;

// nurodyti eilučių ir stulpeių skaičių
function nustatyti($eil, $stulp)
{
$this->eil=$eil;
$this->stulp=$stulp;
}

// sukurti lentelę
function kurti_lentele()
{
echo "<table border=$krastine>";

for ($x=1; $x<=$this->eil;$x++)
{
echo "<tr>";
for ($y=1; $y<=$this->stulp;$y++)
{
echo "$x, $y";
}
echo "</tr>";
}
echo "</table>";

}

}

class geresne_lentele extends lentele
{
function nurodyti_krastine($storis)
{
$this->krastine=$storis;
}
}

?>

Tai tiek apie OOP. Kaip matote tai nėra itin sudėtinga, tačiau reikia nuolat tobulintis, praktikuotis, dirbti....