Errores de herencia en PHP5

Hoy he descubierto que en PHP si tienes una clase abstracta esta clase no puede heredar de ninguna otra. Lo más gracioso es que en la versión 5.2.6 que es la que utilizo no muestra ningún error específico lo único que dice PHP es que no encuentra la clase en cuestión.

¿Por qué una clase abstracta no puede heredar de otra?

¿Por qué PHP no permite la herencia múltiple?

¿Por qué PHP no permite el polimorfismo?

Comentarios

Anler Hernández Peral ha dicho que…
Maestro, yo utilizo php 5.2.11 y sí que puedo crear clases abstractas que hereden de otras! así que no creo que sea cuestión de php sino de tu versión o algo, en cuanto a por qué lenguajes como php, c#, visual basic, ruby, objective-c, java,etc no permiten herencia múltiple es un tema muy debatido y su causa se debe a las ambigüedades que trae consigo la herencia múltiple (mira en wikipedia el problema del diamante), aunque técnicamente php soporta cierto tipo de herencia múltiple a través de las interfaces(yo en lo personal prefiero la herencia múltiple pura y dura), sin embargo lenguajes como ruby soportan 'Mixins' que permiten que una clase implemente funcionalidades de otras evitando los típicos problemas de la herencia múltiple ;)
Por lo de polimorfismo, php sí que soporta polimorfismo, más concretamente polimorfismo subtipado, recuerda que puedes tener una clase A con un método x y dos clases B y C que hereden de A y llamar en cualquier objeto de estas clases al método x sin tener que preocuparte sobre qué objeto estás haciendo la invocación del método ya que cada clase lo implementaría de manera conveniente :)
Pues lo de la clase abstracta debe ser mi versión, fíjate que hay 5 revisiones entre la tuya y la mía, además esto suena a bug más que a otra cosa.
En cuanto al polimorfismo lo que quiero decir es que si A tiene una función x la clase B que hereda de A pueda redefinirla con un nuevo código e incluso puedan existir múltiples funciones dentro de una misma clase con el mismo nombre y lo único que cambio es el parámetro, todo esto existe en java y le hecho de menos en PHP.
Anler Hernández Peral ha dicho que…
Ni que lo digas, yo no se ni papa de java pero si un poco de c++, y del polimorfismo que hablas es conocido como paramétrico y sí que estaba guay, recuerdo que esto lo utilizaba mucho en los constructores de clases para crear el constructor, el constructor de copia, y el constructor de conversión, pero este polimorfismo es posible en java y c++(y otros) porque son lenguajes fuertemente tipados y compilados, es decir, cuando tenías dos funciones con el mismo nombre, la llamada al método se desambiguaba por el tipo y número de los argumentos de estos métodos cuando en cualquier lenguaje interpretado puedes pasar el número de parámetros que quieras a un método.
En fin, que trabajar con un lenguaje interpretado tiene sus ventajas y desventajas, es cuestión de valorar posibilidades, php5 por ejemplo viene con la API Reflection que permite hacer ingeniería inversa de funciones, clases, etc, ruby soporta clases abiertas e incluso modificar su código mediante instrospección en tiempo de ejecución lo que ha llevado a frameworks escritos en ruby como rails a ser ridículamente extensibles.
Yo en particular extraño la sobrecarga de operadores que no existe en java ni php y muy débil en c# pero sí bastante fuerte en Ruby, de ahí mi devoción por este lenguaje :3