kubuś - namieszałeś nieco, choć same przykłady kodu podałeś poprawnie.
Problem polega bowiem na tym, że dzięki interfejsom kod nie staje się nawet minimalnie szybszy. Można nawet zaryzykować stwierdzenie, że jest wolniejszy.
Pozwala jednak na pisanie znacznie bezpieczniejszych aplikacji, i łatwiejsze wykrywanie błędów. Dlatego przydają się bardzo.
squid - podstawowa wartość interfejsów pojawia się dopiero wtedy, gdy zaczynasz korzystać z biblioteki SPL (polecam serdecznie) - gdzie interfejsy dają dodatkowe możliwości poszczególnym obiektom, lub gdy chcesz przeprowadzać test na typ wprowadzanego do metody parametru.
Wtedy szczególnie przydaje się możliwość implementowania kilku różnych interfejsów, co nie jest możliwe w przypadku klas (nie można dziedziczyć po 2 klasach równocześnie).
<?php
interface Samochod{
function run();
}
interface PojazdPasazerski{
function otworzDrzwi();
}
class Maluch implements Samochod {
function run(){
}
}
class Ford implements Samochod, PojazdPasazerski{
function run(){
}
function otworzDrzwi(){
}
}
####
function cosZDrzwiami( pojazdPasazerski $Car ){
$Car->otworzDrzwi();
}
function jedziem( samochod $Car ){
$Car->run();
}
$Auto1 = new Maluch;
$Auto2 = new Ford;
// w obu przypadkach zadziała poprawnie, choć inaczej;)
jedziem( $Auto2 );
jedziem( $Auto1 );
cosZDrzwiami( $Auto2 );
cosZDrzwiami( $Auto1 ); // maluch nie musi mieć drzwi;) wiec nie zostanie przyjęty do tej funkcji - fatal error
?>
Powyższy przykład pokazuje, że jeśli programista piszący funkcję
cosZDrzwiami zażyczy sobie, by otrzymywany parametr był typu pojazdPasazerski, to może być pewien, że obiekt ten ma dostępną, publiczną metodę
otworzDrzwi(), gdyż jest ona wymuszona przez interfejs.
Natomiast piszący
jedziem() wie, że w otrzymanym obiekcie będzie zaimplementowana metoda run()