Interfejs to swego rodzaju wzorzec dla klas. Zadaniem interfejsu jest dostarczenie użytkownikowi informacji na temat tego, jakie
publiczne metody (i tylko metody) musi zaimplementować w klasie bazującej na danym interfejsie.
Klasa abstrakcyjna reprezentuję szeroką grupę różnego rodzaju obiektów, które łączy tylko kilka wspólnych cech. Dobrym przykładem mogą być figury matematyczne, do których zaliczamy np. koło, kwadrat, czy trójkąt. Klasy ogólnej FiguraMatematyczna nie jesteśmy w stanie zdefiniować, wiemy jedynie, że "jednoczy" ona wszystkie figury, które mają określoną definicję. Co więcej dla każdej z tych figur możemy zdefiniować ogólne metody, których zadaniem będzie np. policzenie obwodu, czy pola. Będą to oczywiście metody abstrakcyjne, ponieważ obwód i pole prawie zawsze obliczamy inaczej. Trochę kodu:
abstract class FiguraMatematyczna {
abstract protected function obwod();
abstract protected function pole();
}
class Trojkat extends FiguraMatematyczna {
private $_bok_a;
private $_bok_b;
private $_bok_c;
public function __construct($bok_a, $bok_b, $bok_c) {
$this->_bok_a = $bok_a;
$this->_bok_b = $bok_b;
$this->_bok_c = $bok_c;
}
public function obwod() {
return $_bok_a + $_bok_b + $_bok_c;
}
public function pole() {
// ...
}
}
Oczywiście to tylko przykład, któremu z matematycznego punktu widzenia duuuuuuużo brakuje

Edycja:
Klasa abstrakcyjna to taka, dla której nie możemy utworzyć instancji obiektu, bo nie miałoby to sensu, tzn. byłby to obiekt, który nie określałby na tyle szczegółowo właściwości interesującej nas "rzeczy", abyśmy mogli tę rzecz dokładnie zidentyfikować.