⊗ppOpIfAp 68 of 107 menu

ინტერფეისების გამოყენება 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 ყველა ფიგურის ჯამური პერიმეტრის საპოვნელად.

azbydeenesfrkakkptruuz