2011-12-17 1 views
15

No, non mi riferisco al costrutto linguistico unset(), ma al tipo (non impostato). Dal manuale PHP:In PHP, quale scopo ha (unset) avere?

I calchi consentite sono:

  • (int), (intero) - Cast a intero
  • (bool), (booleano) - Cast a booleano
  • (float), (doppio), (reale) - Cast galleggiare
  • (stringa) - Cast a stringa
  • (array) - Cast a matrice
  • (oggetto) - Cast di opporsi
  • (unset) - Cast a NULL (PHP 5)

URL: http://php.net/manual/en/language.types.type-juggling.php

Qualcuno ha qualche idea su questo (o anche utilizzato in un progetto vero e proprio)?

+0

Controllare il commento di questo ragazzo fuori, sembra solo un altro modo per unset(): http://www.php.net/manual/en/language.types.type-juggling.php#89637 –

+1

@Madmartigan: quel tizio ha torto. Aspettiamo una risposta dal raggiro. Ha spiegato un po '[qui] (https://bugs.php.net/bug.php?id=55164) – meze

+0

concordato con @meze, (unset) $ var in realtà non annulla la variabile $ var – Lepidosteus

risposta

0

Lo scopo è quello di lanciare a NULL, come già scritto nella tua domanda:

(unset) - cast to NULL (PHP 5) 

Quindi diciamo che avete una variabile $var di cui isset($var) è TRUE. È quindi possibile lanciare quella variabile NULL:

/** 
* @param mixed $var anything 
*/ 
function func($var) 
{ 
    if (isset($var)) 
    { 
     $var = (unset) $var; 
    } 
    # the rest of the code expects $var to be NULL 
    ... 
} 

Certo, $var = NULL avrebbe fatto lo stesso qui, ma w/o fusione.

+1

Lo comprendiamo tutti. Ma la domanda è ... a cosa serve? – meze

+0

Per i casi qualcuno potrebbe averne bisogno. – hakre

+1

Come? Non riesco davvero a pensare a nessun caso – meze

4

Non sapevo nemmeno che fosse una cosa, ma sembra che lo scopo sia solo la completezza per i primitivi di php disponibili (NULL è uno di questi). Si noti che questo trasmette i dati .. non esegue una scrittura.

$x = 'foon'; 
$y = (unset)$x; 
var_dump($x, $y) // 'foon', NULL 

Nota che x non null è a dispetto del cast.

Per quanto posso dire, non c'è motivo di usare mai (unset)<anything> invece di scrivere solo NULL. Forse qualcun altro può trovare una risposta migliore, però.

+2

In breve: "non serve" – sirbrialliance

+0

Valuterà ''. 'NULL' non lo farà. – rightfold

1

L'unica cosa che posso pensare è un caso d'uso futuro in cui una classe può definire come funzionano gli operatori cast, ad esempio con __toString(). Una classe potrebbe potenzialmente essere contrassegnata come non nullable e quindi il cast su null genererebbe un'eccezione. Ciò sarebbe fondamentalmente diverso dall'assegnazione di NULL, anche se sul suo nome è unset un mistero.

+0

Perché 'unset'? Penso che vogliano avere cast per ogni tipo, anche per null. Ma c'è un problema con '(null)' perché questo non è altro che 'NULL' tra parentesi. Quindi molto probabilmente devono evitare risultati inaspettati. – Krzysiek

2

Io uso (unset) casting per evitare di creare brutti ifelse dichiarazioni in situazione se è necessario convalidare e utilizzare molte variabili, ma se una variabile è considerata corretta e non si desidera controllare rimanente.

Per esempio, avete seguente codice:

$variableone = "ffo"; 
$variabletwo = "obb"; 
$variablethree = "aar"; 

if(checkonefailed($variableone)) 
{ 
    outputsomething(); 
} 
else 
{ 
    dosomething($variableone) 
    if(checktwofailed($variabletwo)) 
    { 
     outputsomething(); 
    } 
    else 
    { 
     dosomething($variabletwo) 
     if(checkthreefailed($variablethree)) 
     { 
      outputsomething(); 
     } 
     else 
     { 
      dosomething($variablethree) 
      //And so own 
     } 
    } 
} 

si può riscrivere così:

$variableone = "ffo"; 
$variabletwo = "obb"; 
$variablethree = "aar"; 

if(checkonefailed($variableone)) 
{ 
    outputsomething(); 
} 
//False or check 
elseif((unset)(dosomething($variableone))||(checktwofailed($variabletwo))) 
{ 
    outputsomething(); 
} 
elseif((unset)(dosomething($variabletwo))||(checkthreefailed($variablethree))) 
{ 
    outputsomething(); 
} 
elseif((unset)(dosomething($variablethree))/*or next variable*/) 
{ 
    //And so own 
} 

Idea tratto dal codice di programmazione Go

if variableone := "ffo"; checkonefailed(variableone) { 
    outputsomething() 
} else if dosomething(variableone); variabletwo := "obb"; checktwofailed(variabletwo) { 
    outputsomething() 
} else if dosomething(variabletwo); variablethree := "aar"; checkthreefailed(variablethree) { 
    outputsomething() 
} else dosomething(variablethree) 
0

Secondo php.net:

Esempio # 2 Utilizzo (non impostato) fusione

(non impostato) fusione è spesso confuso con la funzione unset(). (non impostata) la trasmissione funge solo da cast di tipo NULL, per completezza. Non altera la variabile che sta trasmettendo.

Quindi, il modo in cui ho letto che è "Tutti i tipi sono calcinabile, null è un tipo così solo per coerenza abbiamo aggiunto un cast a null"