¿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?
Respuesta
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.
Excelente respuesta. ¿Hay diferencias entre ser una clase para padres y ser una clase abstracta? –
@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. –
buena explicación. Tengo algo que agregar ... En PHP y Java, los métodos en la interfaz deben ser públicos. – Alex
La manual de PHP lo explica de forma sencilla y ofrece muchos ejemplos:
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 writeLine
abstract
para que cualquier clase que se extienda LoggerBase
solo necesita especificar cómo escribir en su registro particular.
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.
- 1. php: ¿Cuándo usar la clase abstracta y de interfaz?
- 2. ¿Qué es SAPI y cuándo lo usarías?
- 3. Cuándo usar la clase o interfaz abstracta?
- 4. crear objeto de clase abstracta e interfaz
- 5. ¿Qué es la clase abstracta en php?
- 6. Cómo y cuándo usar una clase abstracta
- 7. ¿Qué es el bloqueo en MySQL y cuándo lo usarías?
- 8. ¿Qué es SELF JOIN y cuándo lo usarías?
- 9. clase e interfaz abstractas puras
- 10. Clase o interfaz abstracta. ¿Qué camino es correcto?
- 11. ¿Es una interfaz de Java una clase abstracta?
- 12. Clase abstracta 100% frente a la interfaz
- 13. ¿Cuándo usarías $ this keyword en PHP?
- 14. php clase abstracta extendiendo otra clase abstracta
- 15. clase abstracta no implementa interfaz
- 16. ¿Puede una clase extender una clase e implementar una interfaz?
- 17. ¿Qué es asincrónico y espera y cuándo los usarías en el desarrollo de Windows?
- 18. C# Interfaz implementada por clase abstracta vacía
- 19. ¿Cuándo usarías delegados en C#?
- 20. Las interfaces (interfaz/clase abstracta) no son abstracciones?
- 21. ¿Por qué declarar una interfaz como abstracta?
- 22. ¿Cuál es la clase o Interfaz rápida, abstracta?
- 23. ¿Cuál es la diferencia entre una interfaz y una clase abstracta?
- 24. ¿Es la misma cosa una interfaz y una clase abstracta con solo métodos abstractos virtuales?
- 25. Clase genérica e implementa interfaz
- 26. ¿Cuándo debería declarar las variables en una clase de PHP?
- 27. ¿Para qué sirve crear una clase dentro de la interfaz e interfaz dentro de la clase
- 28. ¿Cómo envuelvo una interfaz C++ (clase abstracta) en C++/CLI?
- 29. Java clase abstracta implementa la interfaz
- 30. ¿Necesita una clase abstracta así como una interfaz?
¿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