Подтвердить что ты не робот

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
4b9b3361

Ответ 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 "создает" новую переменную, которая имеет значение по умолчанию, если мы не предоставим значение для необязательного параметра. Но в случае, если мы его предоставим, мы должны предоставить переменную, для которой ссылочным параметром является только псевдоним.