Poznajemy dalej MVC i klasy abstrakcyjne. Uczymy się, że w odróżnieniu od interfejsów, klasy abstrakcyjne mogą posiadać metody z implementacjami. Do dzieła.

Oto nasz kontroler z poprzedniej lekcji:

<?php 

abstract class InvokableController {
    abstract public function __invoke($path);
    
}

class HomeController extends InvokableController {

    public function __invoke($path){
        require __DIR__ . "/$path.php";
    }
}

$invokable = new HomeController();
$invokable("helloname");

Klasa HomeController musi implementować metody abstrakcyjne klasy abstrakcyjnej, z której dziedziczy. Ale sama klasa abstrakcyjna może posiadać nie-abstrakcyjne metody, np. konstruktor:

<?php 

abstract class InvokableController {
    protected $path;

    public function __construct($path)
    {
        $this->path = $path;
    }
    
    abstract public function __invoke();
    
}

class HomeController extends InvokableController {

    public function __invoke(){
        require __DIR__ . "/$this->path.php";
    }
}

$invokable = new HomeController("helloname");
$invokable();

Nadal – abstrakcyjna oznacza, że nie można utworzyć instancji klasy InvokableController. Ale można utworzyć nieabstrakcyjną metodę, nawet konstruktor, który jest dziedziczony.

Klasa HomeController dziedziczy konstruktor z klasy abstrakcyjnej. Mamy też nowy modyfikator dostępu – protected.

Oznacza on, że path jest dostępne zarówno w klasie InvokableController jak i klasach dziedziczących z niej, ale nigdzie indziej. Taki 'private’ rozszerzony o klasy pochodne.

Plik helloname.php ma następującą treść:

<?php 
echo "<h1>Hello name page</h1>";
echo "<br>";
echo @"Hello $name";

W następnej lekcji zajmiemy się już poprawnym jego wyświetlaniem.