2016-01-09 11 views
6

Mentre in generale i suggerimenti sono una buona cosa, c'è una situazione che trovo piuttosto fastidiosa e mi chiedevo se c'è un modo semplice per aggirarla.

consideri una funzione che ha un solo output variabile:

function dumb_foo($param1, $param2, &$out = null) { 
    $out = $param1.'||'.$param2; 
    return $param1*$param2; 
} 

Ora si effettua una chiamata come ad esempio:

dumb_foo(5, 6, $my_out); 

Risultati in un accenno anche se è riempito dalla funzione. Quindi sì, è possibile inizializzare la variabile prima

$my_out = null; 
dumb_foo(5, 6, $my_out); 

ma è ridondante.

C'è qualche altro modo per evitare il suggerimento in questa situazione senza rimuoverlo completamente o aggiungere un'inizializzazione non necessaria?

+0

perché questo & $ out = null –

+0

Non capisco questo suggerimento utilizzando NetBeans 8.1 con un 5.6 progetto PHP. – VolkerK

risposta

0

Penso che tu fraintenda come funzionano i valori predefiniti. Il problema è che $my_out non è definito quando si effettua la seguente chiamata

dumb_foo(5, 6, $my_out); 

Quindi, si sta effettivamente passando null (al contrario di non passare un argomento a tutti), il che significa che il vostro valore predefinito è mai usato (per coincidenza, il tuo valore di default è anche null). Per illustrare la differenza:

function dumb_foo(&$out = 'a') { 
    print $out . "\n"; 
} 

dumb_foo($i); // $i is not defined, so prints nothing 
dumb_foo(); // prints 'a', the default value 

In ogni caso, è possibile disattivare l'opzione "non inizializzate Variabile" suggerimento del tutto:

Tools -> Options -> Editor -> Hints -> PHP -> Unitialized Variables 
+0

Grazie per il tuo commento ma non è una risposta alla mia domanda né è stato utile. Hai pensato che forse ho aggiunto il valore di default in modo che io possa scegliere di NON passare un parametro a tutti se non ne ho bisogno? – Collector

+0

Mi riferivo a "Risultati in un suggerimento anche se è occupato dalla funzione". - Questo mi ha indicato che hai frainteso il motivo per cui il suggerimento è stato generato perché il suggerimento viene generato subito prima che la funzione venga chiamata, quindi in realtà non ha nulla a che fare con la funzione. Se mi sbaglio, allora mi scuso. – FuzzyTree

+0

Intendevo dire che la funzione chiamata è quella che assegna il valore, quindi non ho bisogno (da parte mia) di inizializzarlo. Quindi, a vostra conoscenza, PHP (né NetBeans) non hanno un'opzione per definire una variabile come out-only per garantire che il chiamante non inserisca nulla inutile in esso? – Collector

1

Per quanto a mia conoscenza, penso che il modo migliore è quello di prima guarda come funziona effettivamente il passaggio per riferimento.

caso 1: fa riferimento variabile $in già inizializzato ma parametro $outNON inizializzato

function increment(&$out) { 
    $out++; 
} 

$in = 4 ; //NOTE: already initialized 
increment($in); 
echo $in; //add up to 5 

caso 2: fa riferimento variabile $inNON inizializzato ma parametro $out inizializzato

012.
function increment(&$out = 4) { 
     $out++; 
    } 

    //No initialization of $in 
    increment($in); 
    echo $in; // add up to 1 
    //NOTE:No effect on referenced variable 

caso 3: fa riferimento variabile $inNON inizializzato e il parametro $outNON inizializzati

function increment(&$out) { 
     $out++; 
    } 

    //No initialization of $in 
    increment($in); 
    echo $in; //add up to 1 

Nel mio parere, caso 3, sarà una valida soluzione per l'esempio che descrivi. Pertanto, la rimozione dell'inizializzazione di entrambi $out e $my_out dovrebbe funzionare correttamente.Qualcosa del genere:

function dumb_foo($param1, $param2, &$out) { 
    $out = $param1.'||'.$param2; 
    return $param1*$param2; 
} 
dumb_foo(5, 6, $my_out); 

Spero che questo aiuti!

+0

Grazie per aver risposto ma non sembra che quello che scrivi sia rispondere alla mia domanda. Ci sarà un suggerimento in entrambi i casi. – Collector

0

Netbeans ha un'opzione in Tools -> Options -> Editor -> Hints -> PHP -> Uninitialized Variabled chiamato Check Variables Initialized by Reference

A quanto pare è disattivata per default, perché essa influisce sulle prestazioni del IDE.

Maggiori informazioni su questo: NetBeans bug thread

+0

Grazie per aver risposto. Selezionando questa opzione e guardando il codice sorgente non è stato rimosso il suggerimento. Deselezionare e riprovare non ha fatto alcuna differenza. L'hai provato tu stesso? – Collector

+0

Sì, l'ho provato con il codice che hai postato –

+0

OK, beh, i suggerimenti sono ancora lì, se controllo "Controllare le variabili inizializzate per riferimento" o no, almeno con NetBeans 8.02 e 8.1. Dovrò votare questa risposta. – Collector

Problemi correlati