Si defino una interfaz en PHP, y una clase de fábrica que crea una instancia de esa interfaz, ¿hay alguna manera de forzar al código del cliente a usar solo la interfaz y no la clase concreta subyacente? Desde mi entendimiento, los clientes también pueden usar cualquier función/campo público en la clase subyacente.¿Cuál es el propósito de las interfaces en php?
Aquí se muestra un ejemplo:
<?php
interface IMyInterface
{
public function doSomething();
}
?>
<?php
class ConcreteImplOfMyInterface implements IMyInterface
{
const NotPartOfInterface = 'youcantseeme';
public function doSomething()
{
}
}
?>
<?php
class MyInterfaceFactory
{
public static function createMyInterface()
{
return new ConcreteImplOfMyInterface();
}
}
?>
<?php
function client()
{
$myInterface = MyInterfaceFactory::createMyInterface();
return $myInterface::NotPartOfInterface;
}
?>
+1 para cosas buenas – alex
Entiendo los modificadores de acceso OOP y sé que PHP tiene tipo de alusión. Sin embargo, el hecho de que no tenga insinuaciones de tipo en los tipos de devolución de funciones hace que las interfaces parezcan algo sin sentido para mí. ¿Qué pasaría si quisiera que las clases en el mismo componente lógico puedan invocar métodos públicos entre sí, pero quería que ese componente como un todo exponga las interfaces públicas que eran la única forma de comunicarse con ese componente? No parece posible en PHP. – jameswelle
Una cosa interesante es que puedes acceder a métodos/variables protegidos e incluso privados de instancias de la clase actual. Por ejemplo, si la clase User tiene propiedad privada $ token, puede tener un método dentro de la clase User como este: public function changeToken (User $ user) {$ user-> token = '1234'; } – Joe