2016-05-13 35 views
7

Voglio definire una funzione PHP 7 che accetta un parametro di tipo misto. (Quello che voglio è l'equivalente di un parametro di tipo generico in C#; se c'è un modo migliore per emularlo in PHP 7, per favore fatemelo sapere.)PHP 7: Come utilizzare il tipo di parametro misto nelle mie proprie funzioni?

Il mio codice è il seguente.

<?php 
declare (strict_types = 1);  

function test (mixed $s) : mixed { 
    return $s; 
} 

// Works 
echo gettype ('hello'); 
// Does not work 
echo test ('hello'); 
?> 

Quando si esegue questo codice, ottengo il seguente.

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of mixed, string given, called in mixed.php on line 11 and defined in mixed.php:4 
Stack trace: 
#0 mixed.php(11): test('hello') 
#1 {main} 
thrown in mixed.php on line 4 

Se io commento la chiamata alla prova(), il codice viene eseguito bene, quindi a quanto pare è almeno bene per me di utilizzare il tipo di parametro misto nella dichiarazione di funzione.

So che le funzioni PHP integrate come gettype() possono assumere parametri misti, anche se non so se utilizzano internamente una tipizzazione rigorosa.

Vedo che "misto" viene anche utilizzato come pseudo-tipo in PHP documentation, quindi potrei fraintendere lo scopo di "misto" come parola chiave PHP, ma quello che sto vedendo qui almeno implica che è una parola chiave legittima. Sto semplicemente usando in un modo a cui non è destinato?

Infine, mi rendo conto che potrei aggirare tutto questo semplicemente non specificando il tipo di parametro, ma mi piacerebbe essere coerente specificando tutti i miei parametri e tipi di ritorno.

Grazie e per favore fatemi sapere se posso fornire ulteriori informazioni.

+2

Sì, 'mixed' non è un tipo reale. Ed essere coerenti è ortogonale alla semantica corretta qui. – mario

+2

FYI mista non è un tipo. (http://php.net/manual/en/language.pseudo-types.php) È solo un ** pseudo tipo **: un suggerimento che qualsiasi tipo potrebbe essere passato o restituito da un metodo ... o forse per una variabile che è stata tipicamente definita come mista per qualsiasi motivo ... A differenza di C#, quello che stai cercando di ottenere potrebbe essere complicato in PHP in particolare ** con strict_types impostato su true **. Tuttavia, è possibile ottenere un effetto quasi simile senza la digitazione severa, nel qual caso i metodi possono accettare qualsiasi tipo fino a quando non si forniscono suggerimenti di tipo. Anche se per i programmatori C# è ancora pessimo ** questo è il succo di PHP ** – Poiz

+1

Grazie mille Mario e Poiz. Sembra che mi accontenterò di aggiungere/* misto */come commento. – FSharpN00b

risposta

7

FYI mista non è un tipo. (Refer to the Documentation). E 'solo un tipo pseudo: un suggerimento che qualsiasi tipo potrebbe essere passato o restituito da un metodo ... o forse per una variabile che è stata debolmente tipizzato come misto per qualsiasi motivo ...

Diversamente da C#, quello che stai cercando di ottenere potrebbe essere complicato in PHP, in particolare con strict_types impostato su true.

Tuttavia, è possibile ottenere un effetto quasi simile senza digitare rigorosamente - nel qual caso i metodi possono accettare qualsiasi tipo fino a quando non si fornisce alcun tipo di suggerimento. Anche se per i programmatori C#, non va bene, tuttavia, è il succo di PHP.