Гольф кода: одна строка синтаксис PHP

10
задан Kendall Hopkins 10 June 2010 в 05:13
поделиться

2 ответа

Единственное решение, которое я вижу, включает временную переменную, поэтому существует некоторое (минимальное) загрязнение пространства имен. Любой способ ужесточить код временной переменной сократит все 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"
8
ответ дан 4 December 2019 в 01:29
поделиться

Мое решение немного длиннее, чем у Шонса, но я все равно решил его выложить. Оно должно работать идентично оригинальному синтаксису, даже в случаях ошибок. По сути, я использую троичный синтаксис, чтобы разрешить две строки в одной. Я также изменил временную переменную на ${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);

?>
2
ответ дан 4 December 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: