Единственное решение, которое я вижу, включает временную переменную, поэтому существует некоторое (минимальное) загрязнение пространства имен. Любой способ ужесточить код временной переменной сократит все 4 из них:
<?php
error_reporting(E_ALL | E_STRICT);
// 1
function func_return_array() { return array(0 => 'hello'); }
$key = 0;
$output = ${!${''}=func_return_array()}[$key];
echo '1: ' . $output . "\n";
// 2
class Thing {}
$class_base = 'Thi'; $class_suffix = 'ng';
$output = new ${!${''}=$class_base.$class_suffix}();
echo '2: ';
var_dump($output);
// 3
$func_base = 'func_'; $func_suffix = 'return_array';
$output = ${!${''}=$func_base.$func_suffix}();
echo '3: ';
var_dump($output);
// 4
function func_return_closure() {
return function() {
return 'This is a closure';
};
}
$output = ${!${''}=func_return_closure()}();
echo '4: ';
var_dump($output);
Вывод:
1: hello
2: object(Thing)#1 (0) {
}
3: array(1) {
[0]=>
string(5) "hello"
}
4: string(17) "This is a closure"
Мое решение немного длиннее, чем у Шонса, но я все равно решил его выложить. Оно должно работать идентично оригинальному синтаксису, даже в случаях ошибок. По сути, я использую троичный синтаксис, чтобы разрешить две строки в одной. Я также изменил временную переменную на ${0}
вместо ${''}
, поскольку она сохраняет символ, а переменные, начинающиеся с цифр, не действительны.
Приведенное ниже утверждение,
line1;
$output = line2;
идентично следующему утверждению для всех возможных случаев.
$output = (line1)&&0?:(line2);
Мое решение:
<?php
error_reporting(E_ALL | E_STRICT);
// 1
function func_return_array() { return array(0 => 'hello'); }
$key = 0;
$output = (${0}=func_return_array())&&0?:${0}[$key];
echo '1: ' . $output . "\n";
// 2
class Thing {}
$class_base = 'Thi'; $class_suffix = 'ng';
$output = (${0}=$class_base.$class_suffix)&&0?:new ${0};
echo '2: ';
var_dump($output);
// 3
$func_base = 'func_'; $func_suffix = 'return_array';
$output = (${0}=$func_base.$func_suffix)&&0?:${0}();
echo '3: ';
var_dump($output);
// 4
function func_return_closure() {
return function() {
return 'This is a closure';
};
}
$output = call_user_func(func_return_closure()); //more straight forward
//$output = (${0}=func_return_closure())&&0?:${0}();
echo '4: ';
var_dump($output);
?>