Przykład # 2 z podręcznika PHP http://php.net/manual/en/language.oop5.traits.php stanyPHP cecha: czy istnieje właściwy sposób, aby zapewnić klasę używając cechę rozciąga się super klasy, która zawiera pewne metody?
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
Jest to prawidłowy kod, ale nie jest bezpieczny w użyciu parent::
w tym kontekście. Powiedzmy, że napisałem moje własne klasy „Hello World”, która nie dziedziczy żadnych innych klas:
<?php
class MyOwnHelloWorld
{
use SayWorld;
}
?>
Kod ten nie przyniesie żadnych błędów, dopóki nie wywołać metodę sayHello()
. To jest złe.
Z drugiej strony, jeśli cecha wymaga użycia pewnej metody: , mogę napisać tę metodę jako abstrakcyjną, i jest to dobre, ponieważ zapewnia, że cecha jest poprawnie używana podczas kompilacji. Ale to nie ma zastosowania do klas dominujących:
<?php
trait SayWorld
{
public function sayHelloWorld()
{
$this->sayHello();
echo 'World!';
}
public abstract function sayHello(); // compile-time safety
}
Więc moje pytanie brzmi: Czy istnieje sposób, aby zapewnić (w czasie kompilacji, a nie przy starcie), że klasa, która wykorzystuje pewną cechę będzie miał parent::sayHello()
metody?
Co możesz zrobić, to dodać metodę abstrakcyjną, aby zmusić klasę, używając tej cechy, do posiadania wymaganej metody. w ten sposób uniezależnia się od hierarchii klas (idea za cechami: P) – Jarry