აბსტრაქტული კლასები OOP-ში PHP-ში
დავუშვათ, გაქვთ კლასი User, და
მისგან მემკვიდრეობით ღებულობენ კლასები Employee და
Student.
ამ შემთხვევაში, ვარაუდობენ, რომ თქვენ შექმნით
Employee და Student კლასების ობიექტებს,
მაგრამ User კლასის ობიექტებს - არ შექმნით,
რადგან ეს კლასი გამოიყენება მხოლოდ მისი
მემკვიდრეთა საერთო თვისებებისა და მეთოდების
დასაჯგუფებლად.
ამ შემთხვევაში შესაძლებელია User კლასის
ობიექტების შექმნა იძულებით აეკრძალოს, რათა
თქვენ ან სხვა პროგრამისტმა სადღაც შემთხვევით
არ შექმნათ ისინი.
ამისთვის არსებობს ე.წ. აბსტრაქტული კლასები. აბსტრაქტული კლასები წარმოადგენენ კლასებს, რომლებიც განკუთვნილია მათგან მემკვიდრეობის მისაღებად. ამ შემთხვევაში, ასეთი კლასების ობიექტების შექმნა შეუძლებელია.
იმისთვის, რომ კლასი აბსტრაქტულად გამოვაცხადოთ,
მის გამოცხადებისას უნდა დავწეროთ საკვანძო
სიტყვა abstract:
<?php
abstract class User
{
}
?>
მაშ ასე, დავწეროთ აბსტრაქტული
კლასის User რეალიზაცია. დავუშვათ, მას ექნება პრივატული
თვისება name, და აგრეთვე გეთერები და სეთერები
მისთვის:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
?>
User კლასის ობიექტის შექმნის მცდელობა
გამოიწვევს შეცდომას:
<?php
$user = new User; // გამოიტანს შეცდომას
?>
მაგრამ ჩვენი კლასიდან მემკვიდრეობის მიღება
შესაძლებელი იქნება. შევქმნათ კლასი Employee, რომელიც
მემკვიდრეობით მიიღებს ჩვენი აბსტრაქტული
კლასისგან User:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
}
?>
შევქმნათ Employee კლასის ობიექტი -
ყველაფერი იმუშავებს:
<?php
$employee = new Employee;
$employee->setName('john'); // მშობელი კლასის, ანუ User კლასის მეთოდი
$employee->setSalary(1000); // საკუთარი მეთოდი, ანუ Employee კლასის მეთოდი
echo $employee->getName(); // გამოიტანს 'john'
echo $employee->getSalary(); // გამოიტანს 1000
?>
შექმენით აბსტრაქტული კლასი Figure,
რომელიც წარმოადგენს გეომეტრიულ
ფიგურას. დავუშვათ, მისგან მემკვიდრეობით მიიღებენ კლასები
წრის, მართკუთხედისა და კვადრატისთვის.