Хотя в целом подсказки — это хорошая вещь, есть ситуация, которая мне кажется довольно раздражающей, и мне было интересно, есть ли простой способ обойти это.
Рассмотрим функцию, которая имеет переменную только для вывода:
function dumb_foo($param1, $param2, &$out = null) {
$out = $param1.'||'.$param2;
return $param1*$param2;
}
Теперь звоню, например:
dumb_foo(5, 6, $my_out);
В результате появляется подсказка, даже если она заполнена функцией. Так что да, возможно сначала инициализировать переменную
$my_out = null;
dumb_foo(5, 6, $my_out);
но это избыточно.
Есть ли другой способ избежать подсказки в этой ситуации, не удаляя ее полностью или не добавляя ненужную инициализацию?
Насколько я знаю, я думаю, что лучший способ — это сначала посмотреть, как на самом деле работает передача по ссылке.
Случай 1: Ссылочная переменная $in
уже инициализирован но параметр$out
НЕ инициализируется
function increment(&$out) {
$out++;
}
$in = 4 ; //NOTE: already initialized
increment($in);
echo $in; //add up to 5
случай 2: Ссылочная переменная $in
НЕ инициализирован, но параметр$out
инициализируется
function increment(&$out = 4) {
$out++;
}
//No initialization of $in
increment($in);
echo $in; // add up to 1
//NOTE:No effect on referenced variable
случай 3: Ссылочная переменная $in
НЕ инициализирован и параметр$out
НЕ инициализируется
function increment(&$out) {
$out++;
}
//No initialization of $in
increment($in);
echo $in; //add up to 1
По моему мнению, случай 3, будет правильным решением для примера, который вы описываете. Поэтому удаление инициализации обоих $out
а также $my_out
должен делать работу просто отлично. Что-то вроде этого:
function dumb_foo($param1, $param2, &$out) {
$out = $param1.'||'.$param2;
return $param1*$param2;
}
dumb_foo(5, 6, $my_out);
Надеюсь это поможет!
Я думаю, вы неправильно понимаете, как работают значения по умолчанию. Проблема в том, что $my_out
не определен при следующем вызове
dumb_foo(5, 6, $my_out);
Итак, вы фактически проходите null
(вместо того, чтобы вообще не передавать аргумент), что означает, что ваше значение по умолчанию никогда не используется (по совпадению, ваше значение по умолчанию также является нулевым). Чтобы проиллюстрировать разницу:
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
В любом случае вы можете полностью отключить подсказку «Unitialized Variable»:
Tools -> Options -> Editor -> Hints -> PHP -> Unitialized Variables
Netbeans имеет опцию под Tools -> Options -> Editor -> Hints -> PHP -> Uninitialized Variabled
называется Check Variables Initialized by Reference
По-видимому, он отключен по умолчанию, поскольку он влияет на производительность среды IDE.
Подробнее об этом: Поток ошибок NetBeans