Абстрактні класи


Клас, який містить хоча б один абстрактний метод, повинен бути визначений як абстрактний. Абстрактні класи реалізують на практиці один з принципів ООП – поліморфізм. Потрібно пам’ятати, що не можна створити екземпляр абстрактного класу. Методи, оголошені абстрактними, лише описують сенс і не можуть включати реалізації.

При наслідуванні від абстрактного класу, всі методи, позначені абстрактними в батьківському класі, повинні бути визначені в класі-нащадку; крім того, область видимості цих методів повинна збігатися (або бути менш суворою). Більш того, контроль типів (буде розглянуто) і кількість обов’язкових аргументів має бути однаковим.

Приклад абстрактного класу:

<?php
abstract class AbstClass {
     /* Даний метод повинен бути визначений в дочірньому класі */
     abstract protected function getValue();

     /* Загальний метод */
     public function printValue() {
          print $this->getValue() . "\n";
     }
}

class FirstClass extends AbstClass
{
     protected function getValue() {
          return "FirstClass";
     } 
}

$class1 = new FirstClass;
$class1->printValue();
?>

Результат:
FirstClass

Ключеве слово “static”

Оголошення властивостей і методів класу статичними (static) дозволяє звертатися до них без створення екземпляра класу. Атрибут класу, оголошений статичним, не може бути доступний за допомогою екземпляра класу (але статичний метод може бути викликаний).

Доступ до статичних властивостей класу може бути отриманий через оператор ::

Починаючи з версії PHP 5.3.0 існує можливість посилатися на клас використовуючи змінну. Тому значення змінної в такому випадку не може бути ключовим словом (наприклад, self, parent і static).

Приклад статичної властивості

<?php
class FirstClass
{
     public static $var1 = "var1";

     public function staticValue() {
          return self::$var1;
     }
}

class SecondClass extends FirstClass
{
     public function var1Static() {
          return parent::$var1;
     }
}

echo FirstClass::$var1; 
?>

Приклад статичного методу

<?php
class FirstClass {
     public static function myStaticMethod() {
          // ...
     }
}

FirstClass::myStaticMethod(); // виклик метода
?>