2016-01-09 9 views
6

Während im Allgemeinen Hinweise eine gute Sache sind, gibt es eine Situation, die ich ziemlich ärgerlich finde und fragte mich, ob es einen einfachen Weg darum geht.

Betrachten Sie eine Funktion, die ein Nur-Ausgabe-Variable hat:

dumb_foo(5, 6, $my_out); 

Ergebnisse in einem Hauch, obwohl es von der Funktion gefüllt ist:

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

nun einen Anruf wie zu machen. Also ja, es ist möglich, die Variable zuerst zu initialisieren

aber es ist redundant.

Gibt es eine andere Möglichkeit, den Hinweis in dieser Situation zu vermeiden, ohne ihn vollständig zu entfernen oder eine unnötige Initialisierung hinzuzufügen?

+0

warum diese & $ out = null –

+0

Ich habe nicht diesen Hinweis NetBeans 8.1 mit PHP 5.6-Projekt mit. – VolkerK

Antwort

0

Ich glaube, Sie missverstehen, wie Standardwerte funktionieren. Das Problem ist, dass $my_out ist nicht definiert, wenn Sie den folgenden Anruf

dumb_foo(5, 6, $my_out); 

Also, bist du eigentlich in null vorbei (im Gegensatz zu nicht überhaupt ein Argument übergeben), was bedeutet, dass Ihr Standardwert ist nie verwendet (Zufälligerweise ist Ihr Standardwert ebenfalls null). Um den Unterschied zu verdeutlichen:

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 jedem Fall können Sie den „unitialized Variable“ Hinweis vollständig deaktivieren:

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

Danke für Ihren Kommentar, aber es ist keine Antwort auf meine Frage noch war es hilfreich. Hast du in Betracht gezogen, dass ich vielleicht den Standardwert hinzugefügt habe, so dass ich wählen kann, einen Parameter überhaupt nicht zu übergeben, wenn ich keinen Bedarf dafür habe? – Collector

+0

Ich bezog mich auf "Ergebnisse in einem Hinweis, obwohl es von der Funktion gefüllt wird." - Das hat mir gezeigt, dass Sie nicht verstanden haben, warum der Hinweis erzeugt wurde, weil der Hinweis direkt vor dem Aufruf der Funktion generiert wurde, also eigentlich nichts mit der Funktion zu tun hat. Wenn ich mich irre, entschuldige ich mich. – FuzzyTree

+0

Ich meinte, dass die aufgerufene Funktion diejenige ist, die den Wert zuweist, so dass ich (auf meiner Seite) keine Notwendigkeit habe, sie zu initialisieren. Also haben PHP (oder NetBeans) nach Ihrer Kenntnis keine Möglichkeit, eine Variable als "out-only" zu definieren, um sicherzustellen, dass der Aufrufer keine unnötige Null darin steckt? – Collector

1

Nach bestem Wissen und Gewissen, ich denke, der beste Weg ist, zuerst schau dir an, wie Pass by Reference tatsächlich funktioniert.

Fall 1: Variable referenzierte $in bereits initialisiert aber Parameter $outNICHT initialisiert

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

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

Fall 2: Variable referenzierte $inNICHT initialisiert aber Parameter $out initialisiert

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

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

Fall 3: Variable referenzierte $inNICHT initialisiert und Parameter $outNICHT initialisiert

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

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

In meiner eigenen Meinung, Fall 3 wird eine Gültigkeit Lösung für das Beispiel, das Sie beschreiben. Daher sollte das Entfernen der Initialisierung von sowohl $out als auch $my_out die Arbeit gut machen.Etwas wie dieses:

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

Hoffe, dass dies hilft!

+0

Vielen Dank für Ihre Antwort, aber es scheint nicht so, als ob Sie meine Frage beantworten. Es wird einen Hinweis geben, wie auch immer. – Collector

0

Netbeans hat eine Option unter Tools -> Options -> Editor -> Hints -> PHP -> Uninitialized Variabled genannt Check Variables Initialized by Reference

Anscheinend ist standardmäßig deaktiviert, da sie die Leistung der IDE auswirkt.

Mehr dazu: NetBeans bug thread

+0

Danke für die Antwort. Wenn Sie diese Option markieren und den Quellcode betrachten, wurde der Hinweis nicht entfernt. Unchecking und erneutes Versuchen machten keinen Unterschied. Haben Sie das selbst getestet? – Collector

+0

Ja, ich habe es mit dem Code versucht, den Sie gepostet haben –

+0

OK, nun, die Hinweise sind immer noch da, ob ich die "Check Initialized by Reference" prüfe oder nicht, zumindest mit NetBeans 8.02 und 8.1. Ich werde diese Antwort abstimmen müssen. – Collector