Наследование, интерфейсы, клонирование


В следующем небольшом скрипте демонстрируются механизмы:

* Наследование классов
* Абстрактные методы класса
* Интерфейсы
* Наследование интерфейсов
* Имплементация интерфейсов
* Закрытие наследования с помощью final
* Клонирование объектов
* Изменение поведения клонирования с __clone()

// Наследование, интерфейсы, клонирование

interface iTemplateA {
    const X = 'default const';
}

interface iTemplateB extends iTemplateA {
    public function SetPrefix($prefix);
}

abstract class ParentClass implements iTemplateB {

    protected $p = '';

    function __construct() {
    }

    public function SetPrefix($prefix) {
        $this->p = $prefix;
    }

    abstract public function ShowName($name);

}  // class


final class ChildClass extends ParentClass {

    function __construct() {
        parent::__construct();
    }

    final public function ShowName($name) {
        echo $this->p." $namen";
    }

    public function __clone() {
        $this->p = "Goodbye" ;
    }

} // class


$a = new ChildClass;
$a->SetPrefix("Hello");
$a->ShowName("Moscow");
$b = clone $a;
$b->ShowName("Moscow");