⊗ppOpIfAp 68 of 107 menu

PHP-də OOP-də interfeyslerin tetbiqi

Beləliklə, biz artıq müəyyən etdik ki, interfeyslər zəruri olan bütün metodların klassda reallaşdırılmasını idarə etmək üçün yaxşı bir üsuldur.

Gəlin daha bir, daha praktiki misalı nəzərdən keçirək. Tutaq ki, bizdə obyekt-fiqurlar massivini özündə saxlayan bir klass var:

<?php class FiguresCollection { private $figures = []; // fiqurlar üçün massiv } ?>

Kolleksiyaya obyektlər əlavə etmək üçün bizim klassımızda addFigure metodunu reallaşdıraq:

<?php class FiguresCollection { private $figures = []; // Parametr kimi fiqur olan obyekt ötürülür: public function addFigure($figure) { $this->figures[] = $figure; } } ?>

Aydındır ki, biz addFigure metodunun parametri kimi fiqur olan bir obyektin ötürüləcəyini planlaşdırırıq. Lakin bunun üçün heç bir nəzarət yoxdur!

Gəlin tip üçün işarədən istifadə edək və açıq şəkildə obyektlərin tipini Figure kimi göstərək:

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

Gəlin bizim nə etdiyimizlə bağlı anlayaq.

Əgər Figure həqiqətən mövcud olan bir klass olsaydı, onda biz metodun parametrinə həmin klassın obyektlərini, həmçinin onun varislərinin obyektlərini ötürə bilərdik.

Lakin bizdə Figure interfeysdir. Bu halda tip işarəsi o deməkdir ki, metodun parametrinə yalnız bizim interfeysi reallaşdıran klassların obyektləri ötürülə bilər.

Gəlin bizim klassımızın obyektini yaradaq və ona fiqurlar əlavə edək:

<?php $figuresCollection = new FiguresCollection; // Bir neçə kvadrat əlavə edək: $figuresCollection->add(new Quadrate(2)); $figuresCollection->add(new Quadrate(3)); // Bir neçə düzbucaqlı əlavə edək: $figuresCollection->add(new Rectangle(2, 3)); $figuresCollection->add(new Rectangle(3, 4)); ?>

Hər hansı başqa bir klassın obyektini əlavə etməyə cəhd xətaya səbəb olacaq:

<?php $figuresCollection = new FiguresCollection; class Test {}; // hansısa başqa bir klass $figuresCollection->add(new Test); // xəta verəcək ?>

Praktikada belə nəzarət bizə nə verir: kolleksiyaya əlavə olunan bütün fiqurlar Figure interfeysini reallaşdırdığı üçün, biz əmin ola bilərik ki, onların hər birində getSquare metodu və getPerimeter metodu olacaq.

Mümkündür ki, gələcəkdə kvadrat və düzbucaqlıdan əlavə, məsələn, həm də üçbucaq peyda olacaq. Bu halda üçbucağın da getSquaregetPerimeter metodları olacaq.

Praktikada bu bizə aşağıdakıları verir: biz FiguresCollection klassında, məsələn, kolleksiyanın bütün fiqurlarının ümumi sahəsini tapan getTotalSquare metodu edə bilərik. Bu metodda biz fiqurlar massivini tsikl ilə dolaşacaq və hər bir fiqurun getSquare metodunu çağıracağıq.

Hər bir fiqur Figure interfeysini reallaşdırdığı üçün, biz 100% əmin ola bilərik ki, hər bir fiqurda bu getSquare metodu olacaq.

Beləliklə, metodun reallaşdırılması:

<?php class FiguresCollection { private $figures = []; public function addFigure(Figure $figure) { $this->figures[] = $figure; } // Ümumi sahəni tapaq: public function getTotalSquare() { $sum = 0; foreach ($this->figures as $figure) { $sum += $figure->getSquare(); // getSquare metodundan istifadə edirik } return $sum; } } ?>

Mənim koduma baxmadan eyni FiguresCollection klassını reallaşdırın.

FiguresCollection klassına bütün fiqurların ümumi perimetrini tapmaq üçün getTotalPerimeter metodunu əlavə edin.

azbydeenesfrkakkptruuz