Класс, который содержит хотя бы один абстрактный метод, должен быть определен как абстрактный. Абстрактные классы реализуют на практике один из принципов ООП — полиморфизм. Нужно помнить, что нельзя создать экземпляр абстрактного класса. Методы, объявленные абстрактными, лишь описывают смысл и не могут включать реализации.

При наследовании от абстрактного класса, все методы, помеченные абстрактными в родительском классе, должны быть определены в классе-потомке; кроме того, область видимости этих методов должна совпадать (или быть менее строгой). Более того, контроль типов (будет рассмотрено) и количество обязательных аргументов должно быть одинаковым.

Пример абстрактного класса:

<?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::$my_static;
    }
}

echo  FirstClass::$my_static; 
?>

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

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

FirstClass::myStaticMethod(); // вызов метода
?>