PHP. Сделать параметр ссылки необязательным?
Скажем, я определил функцию в PHP, и последний параметр передается по ссылке. Есть ли способ сделать это необязательным? Как я могу определить, установлен ли он?
Я никогда не работал с pass-by-reference в PHP, поэтому здесь может быть глупая ошибка, но вот пример:
$foo;
function bar($var1,&$reference)
{
if(isset($reference)) do_stuff();
else return FALSE;
}
bar("variable");//reference is not set
bar("variable",$foo);//reference is set
Ответы
Ответ 1
Взято из официальное руководство PHP:
NULL может использоваться как значение по умолчанию, но его нельзя передать извне
<?php
function foo(&$a = NULL) {
if ($a === NULL) {
echo "NULL\n";
} else {
echo "$a\n";
}
}
foo(); // "NULL"
foo($uninitialized_var); // "NULL"
$var = "hello world";
foo($var); // "hello world"
foo(5); // Produces an error
foo(NULL); // Produces an error
?>
Ответ 2
Вы можете сделать аргумент необязательным, указав для них значение по умолчанию:
function bar($var1, &$reference = null)
{
if($reference !== null) do_stuff();
else return FALSE;
}
Однако обратите внимание, что передача по ссылке - это плохая практика в целом. Если вдруг изменится значение $foo
, я должен выяснить, почему это только для того, чтобы узнать, что он передан по ссылке. Поэтому, пожалуйста, используйте это только в том случае, если у вас есть действующий прецедент (и, кстати, мне больше не доверяют).
Также обратите внимание, что если $reference
должен быть объектом, вы, вероятно, не должны (и не должны) передавать его по ссылке.
Также в настоящее время ваша функция возвращает разные типы значений. Когда ссылка передана, она возвращает null
и в противном случае false
.
Ответ 3
В ответ на сообщение @Martin Perry вы можете различать
foo(); // "NULL"
и
foo($uninitialized_var); // "NULL"
используя func_num_args()
Ответ 4
вы можете установить значения по умолчанию
$foo;
function bar($var1,&$reference = false)
{
if($reference != false) do_stuff();
else return FALSE;
}
bar("variable");//reference is not set
bar("variable",$foo);//reference is set
Ответ 5
попробуйте
use function bar($var1,&$reference=null)
{
if(isset($reference)) do_stuff();
else return FALSE;
}
если вы передадите значение в & $reference, оно примет это значение. или иначе null.
Ответ 6
Два варианта:
Объявить значение по умолчанию, которое находится за пределами обычного диапазона значений, например -1
function bar($var1,&$reference = -1)
{
if($reference !== -1) do_stuff();
else return FALSE;
}
Не объявляйте параметр и проверяйте func_get_args()
, чтобы узнать, было ли оно передано:
function bar($var1)
{
if(count(func_get_args()) > 1) do_stuff();
else return FALSE;
}
Но обратите внимание, что второй подход вызовет устаревшее предупреждение: Call-time pass-by-reference has been deprecated;
Ответ 7
Следующий фрагмент кода иллюстрирует, что ссылка является просто псевдонимом для имени переменной:
<?php
function set_variable(&$var, $val)
{
$var = $val;
}
set_variable($b, 2);
echo $b; // 2
?>
Эта статья статьи Ларри Ульмана объясняет основы передачи переменной по ссылке vs, проходящей по значению.
Интересно, что в конце статьи Ларри есть ссылка на другую article, которая углубляется, чтобы объяснить основы ссылок и переменные в PHP.
В целом, когда параметр ссылки необязателен, задав значение по умолчанию, PHP "создает" новую переменную, которая имеет значение по умолчанию, если мы не предоставим значение для необязательного параметра. Но в случае, если мы его предоставим, мы должны предоставить переменную, для которой ссылочным параметром является только псевдоним.