2011-08-16 12 views
22

Ho appena notato che PHP ha un casting di tipo su (unset) e mi chiedo a cosa potrebbe essere usato. Non disattiva nemmeno realmente la variabile, la lancia su NULL, il che significa che (unset)$anything dovrebbe essere esattamente la stessa cosa che scrivere semplicemente NULL.Chiunque ha mai usato il casting di PHP (non impostato)?

# Really unsetting the variable results in a notice when accessing it 
[email protected]:~$ php -r '$foo = 123; unset($foo); echo $foo;' 
PHP Notice: Undefined variable: foo in Command line code on line 1 
PHP Stack trace: 
PHP 1. {main}() Command line code:0 

# (unset) just set it to NULL, and it doesn't result in a notice 
[email protected]:~$ php -r '$foo = 123; $foo=(unset)$foo; echo $foo;' 

Qualcuno l'ha mai usato per qualcosa? Non riesco a pensare di qualsiasi uso possibile per esso ...

Aggiunto:
idea principale di domanda è:
Qual è ragione per usare (unset)$smth invece di NULL?

risposta

14

Per quanto posso dire, non c'è davvero nessun punto di usare

$x = (unset)$y; 

oltre

$x = NULL; 

Il (unset)$y restituisce sempre nullo, e, a differenza chiamando unset($y), il cast non lo fa influire su $y.

L'unica differenza è che l'utilizzo del cast genera comunque una notifica "variabile non definita" se $y non è definito.

C'è un PHP bug su un problema correlato. Il bug riguarda in realtà un passaggio fuorviante (altrove) nella documentazione che dice:

Se si esegue il cast di una variabile su null, la variabile viene rimossa e viene annullato il suo valore.

E chiaramente non è il caso.

+0

È una buona scoperta quella generazione di avvisi. Per quella prospettiva, potrebbe effettivamente essere abbastanza utile in alcuni posti. – Smar

+0

Sono abbastanza sorpreso di vedere una funzionalità completamente inutile in PHP ... Mi chiedo cosa stavano pensando quando l'hanno aggiunto. Pensavo che mi sarebbe sfuggito qualcosa ...ma immagino che sia completamente inutile dopo tutto – shesek

+0

Il comportamento dell'avviso apre la porta, diciamo, alla registrazione che una variabile non è stata definita anche se non ti interessa il suo valore. In cima alla mia testa, però, non riesco davvero a trovare un caso d'uso per quell'abilità. L'unica altra cosa che posso pensare è che potrebbe essere usato come una sorta di modifica "abbreviata" per sostituire un valore con null, ma hanno ancora qualche nozione nel codice di ciò che il valore in quel luogo era un tempo. –

6

Direi (conoscendo PHP ed è notoriamente ... scelte interessanti per cose diverse, potrei sbagliarmi completamente) che è così che il valore non ha bisogno di impostare su una var. Per motivo esatto di utilizzarlo per un codice, non riesco a pensare a un esempio, ma qualcosa di simile:

$foo = bar((unset) baz()); 

Ci si desidera o bisogno di avere nulla come argomento per bar e ha bisogno ancora di chiamare baz() troppo . La sintassi della funzione è cambiata e qualcuno ha risolto il problema con un nastro anatra, come quello che sembra essere caldo con PHP.

Quindi direi: nessun motivo per usarlo in un'architettura ben pensata; potrebbe essere usato per soluzioni talmente oscure che voterei contro di loro al primo posto.

+3

Non ho idea del perché vorreste concatenare le chiamate di funzione in questo modo se volete sempre passare 'null' a' bar' in primo luogo ... – deceze

1

Ad esempio, può essere utilizzato come questo

function fallback() 
{ 
    // some stuff here 
    return 'zoo'; 
} 

var_dump(false ? 'foo' : fallback()); // zoo 
var_dump(false ? 'foo' : (unset) fallback()); // null 

Anche se fallback() restituisce "zoo" (unset) sarà chiaro che il valore.

Problemi correlati