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.