2010-06-15 7 views
13

¿Por qué es posible crear una interfaz sin especificar un tipo de devolución? ¿Por qué esto no hace esta interfaz inutilizable?¿Por qué es posible tener una interfaz sin tipo de devolución en PHP?

Esto hace que sea más claro:

Interface run 
{ 
    public function getInteger(); 
} 

class MyString implements run 
{  
    public function myNumber() 
    { 

    } 

    public function getInteger() 
    { 
     return "Not a number"; 
    }  
} 

En Java cada interfaz tiene un tipo de retorno como Integer, String o Void

sé que PHP es un lenguaje de programación relajado por desgracia escrito, pero no está allí una solución a ese problema?

¿Es posible definir una interfaz con un tipo de retorno como Integer?

+0

@streeetparade, intenté Haga su pregunta un poco más clara, ¿mi edición tiene sentido para usted? –

Respuesta

19

Tipo dando a entender la función de los argumentos de método/o valores de retorno sólo se admite en PHP7.0 o temprano

Compruebe los detalles aquí: http://php.net/manual/en/migration70.new-features.php

Si está utilizando PHP5 por lo que la actual práctica aceptada es use phpdoc comentarios para indicar que el "contrato" está presente.

/** 
* Does something. 
* @return int 
**/ 
public function getInteger() { return 1; } 

Si el código viola el "contrato" Sugiero encontrar el codificador original y tener que arreglarlo y/o la presentación de un insecto y/o la fijación de usted mismo si es en su propio código base.

+5

El RFC que figura en esta respuesta no está actualizado. Un RFC más reciente es [aquí] (https://wiki.php.net/rfc/return_types). Ha sido aceptado y está presente en PHP7. – Scopey

5

No, no lo hay. Tú mismo dijiste la razón: PHP está escrito a máquina.
Puede tener sugerencias en PHPDoc, o verificar el tipo en la función que utiliza las funciones de la interfaz y arrojar una InvalidArgumentException si obtiene algo más que un entero.

0

En sí mismo lo que quiere no es posible ...

En resumen: Si realmente necesita para hacer cumplir tipos de retorno en sus contratos de código, utilice un lenguaje de tipos estáticos.

Sin embargo, gracias a la magia de __get, __set, __call y amigos, se podría definir una clase base que hace cumplir la seguridad de tipos (que no recomendaría este para otra cosa que la investigación/tiempo de reproducción) pero eso todavía no le ayudará definir tipo de interfaces seguras.

5

Debe tenerse en cuenta que este es ahora posible con PHP7 (sólo Beta1 ha sido puesto en libertad en el momento de escribir esto)

Es posible con la siguiente sintaxis:

interface Run 
{ 
    public function getInteger(): int; 
} 

class MyString implements Run 
{  
    public function myNumber() 
    { 

    } 

    public function getInteger() 
    { 
     return "Not a number"; 
     // Throws a fatal "Catchable fatal error: Return value of getInteger() must be of the type integer, string returned in %s on line %d" 
    }  
} 
Cuestiones relacionadas