interfaces - tipos de metodos en php
¿Qué es una CLASE ABSTRACTA e INTERFAZ y cuándo las usarías en PHP? (5)
El manual de PHP lo explica de manera simple y proporciona muchos ejemplos:
¿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.
Las clases e interfaces abstractas no son específicas 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.
Tanto las clases abstractas como las interfaces 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) oa un objeto que implementa una interfaz.
Suponiendo que comprenda por qué los usa 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 una tipificación estricta y no tiene un concepto de verificación del tiempo de compilación, normalmente puede prescindir de ellos, a diferencia de los lenguajes 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 elimina el "implements Countable", PHP no llamará 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 foreach
.
Las interfaces a nivel de usuario no son extremadamente útiles en PHP, como mencioné anteriormente. Pero si utiliza sugerencias tipo, pueden ser:
function foo(MyInterface $bar)
{
$bar->someMethod();
}
Suponiendo que someMethod
se declara en MyInterface
, entonces se 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 verificará 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 tienes mucho código compartido entre sub clases, 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.
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 use los métodos definidos en ILogger
(tal vez write
y write
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 forma 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 el abstract
write
y writeLine
para que cualquier clase que extienda LoggerBase
lo LoggerBase
solo necesita especificar cómo escribir en su registro particular.