Vuoto come tipo di reso

Stavo testando i tipi di reso con PHP 7.

Ho creato un semplice script per testare i tipi di return di PHP 7:

<?php Class Obj { public function __construct(){ } public function test(): string { //a string needs to be returned return "ok"; } } function foo(): Obj { //instance of Obj needs to be returned return new Obj(); } $o = foo(); echo $o->test(); // output: ok 

Ora in altri linguaggi di programmazione quando si specifica un tipo di reso void vuol dire che non si può restituire nulla o si otterrà un errore. Così ho scritto questo script:

 <?php function foo(): void { } foo(); 

Ora nello script di cui sopra l'output atteso non è nulla. Invece mi dà un errore fatale:

Errore irreversibile: il valore di return di foo () deve essere un'istanza di void, nessuna restituita nella row 2

La mia domanda è (non riuscivo a trovarla), in PHP 7 ci sarà un tipo di void simile?

Modificare:

Una nuova RFC separata per un tipo di reso vuoto è stata pubblicata, ha superato il voto ed è stata implementata in PHP 7.1.
Ora c'è un tipo di reso void in PHP. 🙂

Post originale:

Tratto da wiki.php.net :

Lavoro futuro

Le idee per il lavoro futuro che non rientrano nell'ambito di questa RFC includono:

  • Consenti alle funzioni di dichiarare che non restituiscono nulla (nulla in Java e C)

Quindi al momento non c'è modo di dichiarare che non si restituisce nulla.
Non so quale sia il migliore nella tua situazione, ma probabilmente mi limiterei a dichiarare il tipo di reso per ora.

Per rispondere alla tua domanda se ci sarà un tipo di reso void in PHP 7:
Non c'è ancora alcuna garanzia , ma penso che sia molto probabile che il void o un sinonimo saranno implementati in qualche modo.

Autore dei tipi di return RFC qui. In PHP 7.0 non ci saranno tipi di restituzione void dal momento che RFC non l'ha aggiunto e nessuno ha fatto alcun altro RFC con targeting per PHP 7.0.

Il tipo void può esistere nella serie PHP 7 se decidiamo che l'aggiunta di nuove parole chiave / riservate è accettabile per le versioni minori anche se interromperanno il codice. Questo è piuttosto incerto, ma è stato fatto in PHP 5.4 con la parola chiave callable .


Personalmente, non penso che abbiamo bisogno di void ; abbiamo già null . Dal manuale :

Il valore NULL speciale rappresenta una variabile senza valore. NULL è l'unico valore ansible di tipo null.

In PHP una function che non restituisce nulla restituirà implicitamente null . Ciò significa che non puoi mai effettivamente restituire nulla *. Il passaggio alla rotta null significa che non ci sono interruzioni di compatibilità con le versioni precedenti poiché null non sarà un nome valido di class / interface / tratto che inizia in PHP 7.0 e non aggiunge alcuna nuova chiave o parole riservate.

* Le persone che hanno familiarità con il motore di Zend si renderanno conto che non puoi restituire nulla, ma se non hai restituito nulla, la variabile che stai assegnando sarà assegnata a null, il che li rende logicamente equivalenti.


In PHP 7.1 ci sarà uno pseudo-tipo void . È definito nel Void Return Type RFC .

Personalmente sono triste per questo perché l'autore di RFC aveva precedentemente "smesso" e avevo raccolto la RFC. Poi la prossima cosa so che è stata proposta e discussa e lei non aspetterebbe che io proponessi tipi di sindacato, che sarebbero stati la contropartita del nulla come notato sopra. Oh bene.

Il tipo di reso void stato accettato per php 7.1. Quindi arriverà in futuro.

Alcuni esempi su come functionrà:

 function should_return_nothing(): void { return 1; // Fatal error: A void function must not return a value } function returns_null(): void { return null; // Fatal error: A void function must not return a value } function lacks_return(): void { // valid } function returns_nothing(): void { return; // valid } 

Vedi la RFC di Andrea Faulds per maggiori informazioni!

Non esiste un tipo equivalente per void in php, return NULL; potrebbe soddisfare i tuoi requisiti poiché non ha alcun tipo come 0 o qualsiasi altro valore. Nota: vuoto reale significa nessun return.