Hasta el momento hemos visto que para poder usar un objeto primero hemos de instanciar su clase, pero hay una excepción a esta forma de proceder, las clases abstractas.

Las clases abstractas se declaran con la instrucción abstract, estas no necesitan ser instanciadas, así que podemos acceder a sus métodos de forma similar a la que se accedería a un método estático. Veamos un ejemplo:

ClaseAbstracta.php:

<?php 
abstract class ClaseAbstracta { 
    public function miMetodo(){ 
        echo "Método de una clase abstracta."; 
    } 
} 
?>

script.php:

<?php 
require_once('ClaseAbstracta.php');
ClaseAbstracta::miMetodo(); 
?>

Por lo general declaramos una clase como abstracta cuando sabemos que no ha de ser instanciada y que su función es servir de clase “padre” a otra clase mediante la herencia, donde la clase “hija” si será instanciada.

Podemos marcamos métodos como abstractos (siempre dentro de una clase abstracta) pero estos no podrán tener cuerpo o dará un error tipo “Fatal error: Abstract function ClasePadre::miMetodo() cannot contain body”, además al ser heredada, la clase “hija” estará obligada a declarar y asignarle un cuerpo a los métodos que hemos marcamos como abstractos en la clase “padre” o provocaremos un error.

ClaseAbstracta.php:

<?php 
abstract class ClaseAbstracta { 
//Declaro el método como abstracto sin cuerpo. 

    abstract public function metodoDos(); 
    public function miMetodo(){ 
        echo "Método de una clase abstracta."; 
    } 
} 
?>

ClaseHija.php:

<?php 
require_once('ClaseAbstracta.php'); 

class ClaseHija extends ClaseAbstracta { 
    //Método declarado por obligación al heredar de ClaseAbstracta 
    public function metodoDos(){ 
        //Lo que quieras 
    } 
} 
?>

Ahora simplemente debemos de instanciar ClaseHija y tendremos nuestro objeto extendido de la clase abstracta. Hay que tener en cuenta que no es posible dentro de una clase normal (no abstracta) tener métodos abstractos.