PHP Как узнать, является ли переменная ссылкой? - PullRequest
6 голосов
/ 09 октября 2009

Я хочу вызвать функцию с помощью call_user_func_array, но я заметил, что если аргумент является ссылкой в ​​определении функции и является простым значением в call_user_func_array, появляется следующее предупреждение: Предупреждение: параметр 1 для test () должен быть эталонным, значение задано

Вот простой пример того, что я пытаюсь сделать:

<?php
$a = 0;
$args = array($a);
function test(&$a) {
    $a++;
}
$a = 0;
call_user_func_array('test', $args);
?>

Мой вопрос: как я могу узнать, является ли значение (в данном случае первое значение $ args) ссылкой или нет?

Ответы [ 2 ]

3 голосов
/ 09 октября 2009

Нет, проблема в том, что первым параметром функции является передача по ссылке (то есть функция может изменять аргумент в области действия вызывающего). Следовательно, вы должны передать переменную или что-то, что можно назначить в качестве первого аргумента. Когда вы создаете массив, например array($a), он просто копирует значение переменной $a (равное 0) в слот в массиве. Он никак не ссылается на переменную $a. И затем, когда вы вызываете функцию, это как если бы вы это делали, что не работает:

test(0)

Если вы действительно хотите, вы можете поместить $a в массив по ссылке, но это довольно сложно:

<?php
$a = 0;
$args = array(&$a);
function test(&$a) {
    $a++;
}
call_user_func_array('test', $args);
?>

Что касается того, как вы скажете, что элемент массива является ссылкой ... это сложно. Вы можете сделать var_dump() для массива и найти символ "&":

> var_dump($args);
array(1) {
  [0]=>
  &int(1)
}
1 голос
/ 09 октября 2009

Ознакомьтесь с комментариями на этой странице документации PHP:

http://php.net/manual/en/language.references.spot.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...