2010-06-15 32 views
13

Perché è possibile creare un'interfaccia senza specificare un tipo di reso? Perché questo non rende questa interfaccia inutilizzabile?Perché è possibile avere un'interfaccia senza un tipo di ritorno in PHP?

In questo modo è più chiaro:

Interface run 
{ 
    public function getInteger(); 
} 

class MyString implements run 
{  
    public function myNumber() 
    { 

    } 

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

In Java ogni interfaccia ha un tipo di ritorno come Integer, String o Void

so che PHP è, purtroppo, un linguaggio debolmente tipizzato, ma non è lì una soluzione a questo problema?

È possibile definire un'interfaccia con un tipo di ritorno come Integer?

+0

@streeetparade, ho cercato di fai la tua domanda un po 'più chiara, le mie modifiche hanno senso per te? –

risposta

19

Tipo hinting per funzione/metodo argomenti o valori di ritorno è supportata solo in PHP7.0 o poi

Controllare i dettagli qui: http://php.net/manual/en/migration70.new-features.php

Se si sta utilizzando PHP5 quindi la corrente pratica accettata è quella di utilizzare i commenti phpdoc per indicare che il "contratto" è presente.

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

Se il codice viola il "contratto", suggerisco di trovare il codificatore originale e averli risolvere il problema e/o il deposito di un bug e/o il fissaggio da soli se è nella vostra base di codice.

+5

Le RFC elencate in questa risposta non sono aggiornate. Un RFC più recente è [qui] (https://wiki.php.net/rfc/return_types). È stato accettato ed è presente in PHP7. – Scopey

5

No, non c'è. Hai detto tu stesso la ragione: PHP è tipicamente blandito.
È possibile avere suggerimenti in PHPDoc, oppure controllare il tipo nella funzione che si utilizza le funzioni dell'interfaccia e lanciare un'eccezione InvalidArgumentException se si ottiene qualcos'altro ma un numero intero.

0

In sé e per sé ciò che si vuole non è possibile ...

In breve: se si ha realmente bisogno di far rispettare tipi restituiti nei contratti di codice, utilizzare un linguaggio a tipizzazione statica.

Ma grazie alla magia di __get, __set, __call e gli amici, è possibile definire una classe base che fa rispettare la sicurezza di tipo (io non consiglierei questo per altro che la ricerca/riproduzione) ma che non è ancora aiutare definire le interfacce di sicurezza del tipo.

5

Va notato che questo è ora possibile con PHP7 (solo Beta1 è stato rilasciato al momento della scrittura)

È possibile con la seguente sintassi:

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" 
    }  
} 
Problemi correlati