ინტერფეისების გამოყენება OOP-ში PHP-ში
ამრიგად, ჩვენ უკვე გავარკვიეთ, რომ ინტერფეისები არის კარგი გზა იმის კონტროლისთვის, რომ კლასის ყველა საჭირო მეთოდი რეალიზებულია.
მოდით განვიხილოთ კიდევ ერთი, უფრო პრაქტიკული მაგალითი. დავუშვათ, გვაქვს კლასი, რომელიც შეინახავს ფიგურების ობიექტების მასივს:
<?php
class FiguresCollection
{
private $figures = []; // მასივი ფიგურებისთვის
}
?>
რეალიზებთ ჩვენს კლასში მეთოდს addFigure
ობიექტების კოლექციაში დასამატებლად:
<?php
class FiguresCollection
{
private $figures = [];
// პარამეტრად გადაეცემა ობიექტი ფიგურით:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
ცხადია, ჩვენ ვედარებით, რომ
მეთოდის addFigure პარამეტრად
გადაეცემა ობიექტი ფიგურით. თუმცა ამაზე
არანაირი კონტროლი არ არის!
მოდით გამოვიყენოთ მინიშნება ტიპებისთვის და
აშკარად მივუთითოთ ობიექტების ტიპი, როგორც Figure:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
მოდით გავარკვიოთ, რა გავაკეთეთ.
თუ Figure რეალურად არსებული
კლასი იქნებოდა, მაშინ მეთოდის პარამეტრად ჩვენ შეგვეძლო
გადაგვეცა ამ კლასის ობიექტები, ასევე მისი
მემკვიდრეების ობიექტებიც.
ჩვენთან, თუმცა, Figure არის ინტერფეისი.
ასეთ შემთხვევაში მინიშნება ნიშნავს იმას, რომ
მეთოდის პარამეტრად შეიძლება გადაეცეს მხოლოდ
იმ კლასების ობიექტები, რომლებიც ახორციელებენ ჩვენს ინტერფეისს.
მოდით ვცადოთ ჩვენი კლასის ობიექტის შექმნა და მასში ფიგურების დამატება:
<?php
$figuresCollection = new FiguresCollection;
// დავამატოთ რამდენიმე კვადრატი:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// დავამატოთ რამდენიმე მართკუთხედი:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
სხვა კლასის ობიექტის დამატების მცდელობა გამოიწვევს შეცდომას:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // რაღაც სხვა კლასი
$figuresCollection->add(new Test); // გამოიღებს შეცდომას
?>
რას გვაძლევს პრაქტიკაში ასეთი კონტროლი:
რადგან ყველა ფიგურა, რომელიც დაემატა კოლექციას,
ახორციელებს ინტერფეისს Figure, ჩვენ შეგვიძლია
ვიყოთ დარწმუნებულნი, რომ თითოეულ მათგანს ექნება მეთოდი
getSquare და მეთოდი
getPerimeter.
შესაძლოა მომავალში კვადრატისა და მართკუთხედის გარდა
გამოჩნდეს, მაგალითად, სამკუთხედიც.
ამ შემთხვევაში სამკუთხედსაც ექნება
მეთოდები getSquare და
getPerimeter.
პრაქტიკაში ეს გვაძლევს შემდეგს: ჩვენ შეგვიძლია
კლასში FiguresCollection შევქმნათ,
მაგალითად, მეთოდი getTotalSquare, რომელიც პოულობს
კოლექციის ყველა ფიგურის საერთო ფართობს. ამ მეთოდში
ჩვენ ციკლით გადავუყვებით ფიგურების მასივს და
თითოეული ფიგურისთვის გამოვიძახებთ
მეთოდს getSquare.
რადგან თითოეული ფიგურა ახორციელებს ინტერფეისს
Figure, ჩვენ შეგვიძლია ვიყოთ 100%
დარწმუნებულნი, რომ თითოეულ ფიგურას ექნება
ეს მეთოდი getSquare.
ასე რომ, აი მეთოდის რეალიზაცია:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// ვიპოვოთ საერთო ფართობი:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // ვიყენებთ მეთოდს getSquare
}
return $sum;
}
}
?>
ჩემს კოდს without ეხედვით რეალიზებთ იგივე
კლასს FiguresCollection.
დაამატეთ კლასში FiguresCollection
მეთოდი getTotalPerimeter ყველა ფიგურის
ჯამური პერიმეტრის საპოვნელად.