Это, наверное, простой вопрос, и я боюсь, что ответ может быть «нет», но …
Вот простой фрагмент кода:
function func1() { $bt = debug_backtrace(); print "Previous function was " . $bt[1]['function'] . "\n"; }
Теперь … Можно ли это сделать без временной переменной? На другом языке я мог бы ожидать, что смогу сказать:
function func1() { print "Previous function was " . (debug_backtrace())[1]['function'] . "\n"; }
Увы, в PHP это приводит к ошибке:
PHP Parse error: syntax error, unexpected '[' ...
Если это невозможно сделать, это невозможно, и я буду использовать временную переменную, но я бы предпочел.
Нет, прямое разыменование, к сожалению, не поддерживается в текущих версиях PHP, но, по-видимому, будет представлено в PHP 5.4.
Также см. Терминологический вопрос о «разыменовании»? ,
Разрушение разворота в Array не доступно в PHP 5.3 прямо сейчас, но оно будет доступно в PHP 5.4 ( PHP 5.4.0 RC2 в настоящее время доступен для вас, чтобы возиться с ). Тем временем вы можете использовать функции end()
, reset()
или вспомогательную функцию, чтобы получить то, что вы хотите.
$a = array('a','b','c'); echo reset($a); // echoes 'a' echo end($a); // echoes 'c' echo dereference($a, 1); // echoes 'b' function dereference($arr, $key) { if(array_key_exists($key, $arr)) { return $array[$key]; } else { trigger_error('Undefined index: '.$key); // This would be the standard return null; } }
Обратите внимание, что end()
и current()
сбросят внутренний указатель массива, поэтому будьте осторожны.
Для вашего удобства, если вы будете связывать свои разногласия, это может пригодиться:
function chained_dereference($arr, $keys) { foreach($keys as $key) { $arr = dereference($arr, $key); } return $arr; } // chained_dereference(debug_backtrace(), array(1, 'function')) = debug_backtrace()[1]['function']