2010-09-15 13 views
8

¿Qué es una clase e interfaz abstracta en PHP y cuándo las usarías? Una respuesta profana con un ejemplo sería genial para ayudarme a comprender.¿Qué es una CLASE ABSTRACTA e INTERFAZ y cuándo las usarías en PHP?

+0

¿podría por favor vaya a través de las respuestas a esta y sus preguntas anteriores y, o bien aceptar las más votos o editar sus preguntas a señalar por qué ninguna de las respuestas a resolver su problema. Gracias. – Gordon

Respuesta

7

clases abstractas e interfaces no son específicos de PHP; son características de muchos lenguajes modernos orientados a objetos.

Una clase abstracta es una clase que tiene una o más funciones miembro no implementadas. Utilizarías uno en una situación en la que quisieras un conjunto de clases que tengan comportamientos similares, que difieran solo en unos pocos métodos. Cada una de estas clases se derivaría de la clase abstracta e implementaría los métodos no implementados de la manera apropiada para su caso específico.

Una interfaz es similar a una clase abstracta, pero no contiene implementaciones de métodos, solo firmas. Una clase que implementa una interfaz debe implementar todos los métodos.

Una clase puede implementar muchas interfaces, pero solo se puede derivar de una clase abstracta (o clase principal de cualquier tipo), ya que PHP no admite herencia múltiple.

Ambas clases e interfaces abstractas permiten el polimorfismo; es decir, puede especificar una referencia como un tipo abstracto (que podría referirse a cualquier instancia de clase derivada de él) o a un objeto que implementa una interfaz.

+0

Excelente respuesta. ¿Hay diferencias entre ser una clase para padres y ser una clase abstracta? –

+1

@Travis: Sí. Una clase abstracta no puede ser instanciada. De vez en cuando, creo clases abstractas para compartir la funcionalidad incompleta (suponiendo que la relación padre-sub sea verdaderamente una relación 'is-a'). Una vez que se crea una instancia de la subclase, la funcionalidad completa de la clase/instancia está disponible. –

+0

buena explicación. Tengo algo que agregar ... En PHP y Java, los métodos en la interfaz deben ser públicos. – Alex

0

Una interfaz define un conjunto de métodos que una clase debe implementar. Tal clase implementa la interfaz proporcionando una implementación concreta de esos métodos. Una interfaz no puede contener ninguna implementación propia; es solo un conjunto de firmas de métodos. Si defino una interfaz llamada ILogger, entonces puedo escribir código que usa los métodos definidos en ILogger (quizás write y writeLine) para pasar los mensajes que se registrarán. Puedo pasar cualquier clase que implemente ILogger, y es lo mismo para el código del cliente.

Una clase abstracta es similar, pero puede implementar algunos métodos y estados. Las clases abstractas no se pueden crear instancias, y cualquier clase que las amplíe debe proporcionar una implementación de cada método abstract en la clase principal. Si un conjunto de clases comparte algunos detalles de implementación, pero difiere en otros, puede definir la implementación compartida en una clase abstracta, declarar los métodos diferentes como abstractos, y dejar que las clases secundarias llenen esos con su propia implementación. Si quisiera una manera uniforme de recopilar información del sistema, agregar marcas de tiempo, etc. compartidas por todos mis registradores, podría optar por crear una clase abstracta LoggerBase que maneje esos detalles, marcando write y writeLineabstract para que cualquier clase que se extienda LoggerBase solo necesita especificar cómo escribir en su registro particular.

4

Suponiendo que comprende por qué los utiliza en otros idiomas, los mismos conceptos se aplican a PHP. Las interfaces son "firmas" de clase ... no contienen ningún código. Las clases abstractas no se pueden crear instancias, pero pueden contener funciones implementadas y abstractas (vacías).

Tenga en cuenta que una clase solo puede extender una única clase principal (o clase abstracta), pero puede implementar tantas interfaces como necesite.

Pero dado que PHP no tiene un tipado estricto y no tiene ningún concepto de verificación de tiempo de compilación, puede normalmente prescindir de ellas, a diferencia de idiomas como C++ o Java.

El núcleo PHP requiere interfaces para algunas cosas. Por ejemplo:

class Foo implements Countable 
{ 
    public function count() 
    { 
    return 5; 
    } 
} 

echo count(new Foo()); // returns 5 

Si se quita la "implementa Contable," PHP no llame a su método de count. Existen muchas otras interfaces que puede implementar que permiten que todos los objetos personalizados se comporten de forma similar. Por ejemplo, puede crear un objeto que funcione con una iteración de foreach.

Las interfaces a nivel de usuario no son extremadamente útiles en PHP, como mencioné anteriormente. Pero si usted hace uso de pistas de tipo, pueden ser:

function foo(MyInterface $bar) 
{ 
    $bar->someMethod(); 
} 

Suponiendo someMethod se declara en MyInterface, a continuación, se le garantiza que existe la llamada a $bar->someMethod(). (La razón por la cual esto no es tan útil en PHP como en otros idiomas, es porque la sugerencia de tipo en la firma de la función no se comprobará hasta el tiempo de ejecución).

Las interfaces vacías también pueden ser útiles como formas de categorizar clases Digamos que quiere hacer algo con un conjunto particular de objetos. Todos podrían implementar alguna interfaz vacía. Entonces su código podría simplemente verificar esa interfaz sin tener que saber nada sobre el objeto.

interface Red {} 

class Foo implements Red { } 

$foo = new Foo(); 
if ($foo instanceof Red) 
{ 
    // do something 
} 

Las clases abstractas son útiles cuando se tiene una gran cantidad de código que se comparte entre subclases, pero no es significativo por sí mismo. Puede declarar la clase base como abstracta, implementar toda la funcionalidad compartida y dejar el resto de las funciones en blanco. Al declarar esa clase base como abstracta, nadie podrá usarla por sí mismo.

Cuestiones relacionadas