Posterior a buscar en diferentes repositorios y páginas al concluir dimos con la resolución que te compartiremos ahora.
Solución:
Las clases que implementan un método definido como una firma abstracta en una clase principal o por una interfaz deben seguir ciertas reglas, pero no es necesario que coincidan exactamente.
Esto no está bien documentado, por ejemplo, ni siquiera se menciona en la documentación de interfaces de PHP, pero se menciona en la documentación de clases abstractas:
Además, las firmas de los métodos deben coincidir, es decir, las sugerencias de tipo y el número de argumentos requeridos deben ser los mismos. Por ejemplo, si la clase secundaria define un argumento opcional, donde la firma del método abstracto no lo hace, no hay conflicto en la firma.
En otras palabras, el método debe poder llamarse según la firma, pero no descarta:
- Uso de diferentes nombres de variables en la implementación del método.
- Declarando adicional argumentos opcionales después de los argumentos declarados en la firma del método, si los hay
Tomado de la pregunta, esto funcionaría:
interface ServiceInterface
public static function create($var1, $var2);
class ServiceObject1 implements ServiceInterface
public static function create($url, $server)
//....
class ServiceObject2 implements ServiceInterface
public static function create($methode, $url, $id = null)
//....
No es la forma correcta de implementar una interfaz.
En primer lugar, una interfaz define cómo se debe usar una clase y un parámetro opcional podría romper este motivo.
Además de eso, incluso si tiene exactamente dos parámetros, deben tener su propio significado y este significado debe compartirse.
Hay una gran diferencia entre la firma del método de interfaz:
public static function create($var1, $var2);
y los dos métodos implementados:
public static function create($url, $server)
y:
public static function create($methode, $url)
Además, AFAIK, implementar de esta manera generará una violación estándar estricta porque está cambiando la firma de la interfaz.
Si tiene que crear una interfaz compartida que no tiene sentido, no hay razón para compartir o incluso crear la interfaz.
En PHP 56+, puede usar el operador de puntos suspensivos:
interface ServiceInterface
public static function create(...$params);
class ServiceObject1 implements ServiceInterface
public static function create(...$params)
$url = $params[0];
$server = $params[1];
print "url = $urln";
print "server = $servern";
class ServiceObject2 implements ServiceInterface
public static function create(...$params)
$method = $params[0];
$url = $params[1];
$id = $params[1];
print "method = $methodn";
print "url = $urln";
print "id = $idn";
print "ServiceObject1::createn";
ServiceObject1::create("url", "server");
print "nServiceObject2::createn";
ServiceObject2::create("method", "url", "id");
Producción:
ServiceObject1::create
url = url
server = server
ServiceObject2::create
method = method
url = url
id = url
/despotricar
Para los usuarios que se quejan de lo que el OP quiere hacer: si bien el consejo general es que esto es una mala idea, existen muchos casos en los que al programa realmente no le importa cuáles son los parámetros por adelantado. Un ejemplo de esto sería si su función fuera sumAll
en vez de create
.
Recuerda algo, que te brindamos la opción de añadir una puntuación certera si te fue útil.