⊗ppOpIfAp 68 of 107 menu

Sąsajų taikymas OOP PHP

Taigi, jau išsiaiškinome, kad sąsajos yra geras būdas kontroliuoti, kad klasėje būtų įgyvendinti visi reikalingi metodai.

Panagrinėkime dar vieną, praktiškesnį, pavyzdį. Tarkime, turime klasę, kurioje bus saugomas objektų-figūrų masyvas:

<?php class FiguresCollection { private $figures = []; // masyvas figūroms } ?>

Įgyvendinkime mūsų klasėje metodą addFigure objektų pridėjimui į kolekciją:

<?php class FiguresCollection { private $figures = []; // Parametru perduodamas objektas su figūra: public function addFigure($figure) { $this->figures[] = $figure; } } ?>

Akivaizdu, kad mes tikimės, kad metodo addFigure parametru bus perduodamas objektas su figūra. Tačiau tai niekaip nekontroliuojama!

Naudokime tipų užuominą ir aiškiai nurodykime objektų tipą kaip Figure:

<?php class FiguresCollection { private $figures = []; public function addFigure(Figure $figure) { $this->figures[] = $figure; } } ?>

Išsiaiškinkime, ką mes padarėme.

Jei Figure būtų realiai egzistuojanti klasė, tai į metodo parametrą galėtume perduoti šios klasės objektus, taip pat ir jos palikuonius.

Tačiau pas mus Figure yra sąsaja. Tokiu atveju užuomina reiškia, kad metodo parametru gali būti perduoti tik mūsų sąsają įgyvendinančių klasių objektai.

Pabandykime sukurti mūsų klasės objektą ir į jį pridėti figūras:

<?php $figuresCollection = new FiguresCollection; // Pridėsime porą kvadratų: $figuresCollection->add(new Quadrate(2)); $figuresCollection->add(new Quadrate(3)); // Pridėsime porą stačiakampių: $figuresCollection->add(new Rectangle(2, 3)); $figuresCollection->add(new Rectangle(3, 4)); ?>

Bandymas pridėti bet kurios kitos klasės objektą sukels klaidą:

<?php $figuresCollection = new FiguresCollection; class Test {}; // kažkokia kita klasė $figuresCollection->add(new Test); // išmes klaidą ?>

Ką praktiškai duoda mums toks kontroliavimas: kadangi visos kolekcijoje esančios figūros įgyvendina sąsają Figure, galime būti tikri, kad kiekviena iš jų turės metodą getSquare ir metodą getPerimeter.

Galima ateityje, be kvadrato ir stačiakampio, atsiranda, pavyzdžiui, dar ir trikampis. Šiuo atveju ir trikampis taip pat turės metodus getSquare ir getPerimeter.

Praktiškai tai mums duoda štai ką: galime klasėje FiguresCollection padaryti, pavyzdžiui, metodą getTotalSquare, randantį bendrą kolekcijos figūrų plotą. Šiame metode mes ciklu perimsime figūrų masyvą ir kiekvienai figūrai iškviestime metodą getSquare.

Kadangi kiekviena figūra įgyvendina sąsają Figure, galime būti 100% tikri, kad kiekviena figūra turės šį metodą getSquare.

Taigi, štai metodo realizacija:

<?php class FiguresCollection { private $figures = []; public function addFigure(Figure $figure) { $this->figures[] = $figure; } // Raskime bendrą plotą: public function getTotalSquare() { $sum = 0; foreach ($this->figures as $figure) { $sum += $figure->getSquare(); // naudojame metodą getSquare } return $sum; } } ?>

Nežiūrėdami į mano kodą įgyvendinkite tokią pačią klasę FiguresCollection.

Pridėkite į klasę FiguresCollection metodą getTotalPerimeter, skirtą visų figūrų bendram perimetrui rasti.

Lietuvių
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Mes naudojame slapukus svetainės veikimui, analizei ir personalizavimui. Duomenų apdorojimas vyksta pagal Privatumo politiką.
priimti visus nustatyti atšaukti