2013-05-19 2 views
31

Скажем, я определил функцию в PHP, а последний параметр передается по ссылке. Есть ли способ сделать это необязательным? Как я могу определить, установлен ли он?PHP - Сделать параметр ссылки необязательным?

Я никогда не работал с передачей по ссылке в 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 

ответ

49

Взятые из PHP official manual:

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 

?> 
+0

Посмотрите на @Michal Lohniský [комментарий] (http://stackoverflow.com/a/29895514/1008530). Он хорошо разбирается в NULL. – samuelg0rd0n

8

Вы можете сделать аргумент необязательного, давая им значение по умолчанию :

function bar($var1, &$reference = null) 
{ 
    if($reference !== null) do_stuff(); 
    else return FALSE; 
} 

Однако обратите внимание, что передача по ссылке - это плохая практика в целом. Если вдруг изменится мое значение $foo, я должен выяснить, почему это только для того, чтобы узнать, что он передан по ссылке. Поэтому, пожалуйста, используйте это только в том случае, если у вас есть действующий прецедент (и, кстати, мне больше не доверяют).

Также обратите внимание, что если $reference должен быть объектом, вы, вероятно, don't have to (и не должны) передавать его по ссылке.

Также в настоящее время ваша функция возвращает разные типы значений. Когда ссылка передана, она возвращает null и в противном случае false.

+0

Я бы upvote, если бы не было «[...] объекты передан по ссылке по умолчанию », который может использовать дополнительные разъяснения. http://blog.golemon.com/2007/01/youre-being-lied-to.html – PleaseStand

+1

@PleaseStand Я говорю о том, как он ведет себя на земле пользователя. Я мог бы начать говорить о количестве ссылок и т. Д., Но я думаю, что это только смутило бы OP – PeeHaa

+0

. Я отредактировал ваше сообщение, чтобы добавить ссылку на документацию PHP по этому вопросу, в которой не упоминается «ref counts». Не стесняйтесь возвращать изменения, если вы не думаете, что это достаточно ясно. – PleaseStand

1

попробовать

use function bar($var1,&$reference=null) 
{ 
    if(isset($reference)) do_stuff(); 
    else return FALSE; 
} 

, если вы передаете значение & $ ссылка будет принимать это значение. или иначе null.

3

вы можете установить значения по умолчанию

$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 
1

Два варианты:

Объявите значение по умолчанию, которая находится вне регулярного диапазона значений, например -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;

1

следующий фрагмент кода показывает, что ссылка является всего лишь псевдоним для имени переменной:

<?php 
function set_variable(&$var, $val) 
{ 
    $var = $val; 
} 

set_variable($b, 2); 
echo $b; // 2 
?> 

Этот article автор Larry Ullman объясняет основы передачи переменной по ссылке vs, проходящей по значению.

Интересно, что в конце статьи Ларри есть ссылка на другую article, которая углубляется, чтобы объяснить основы ссылок и переменных в PHP.

В целом, когда параметр ссылки необязателен, задав значение по умолчанию, PHP «создает» новую переменную, которая имеет значение по умолчанию, если мы не предоставим значение для необязательного параметра. Но в случае, если мы его предоставим, мы должны предоставить переменную, для которой ссылочным параметром является только псевдоним.

Смежные вопросы