Есть ли сокращение для следующего:
$a ??= []; # Note: $a ??= [] is equivalent to $a = isset($a) ? $a : []
$b ??= [];
#...
$z ??= [];
Одним из возможных решений является:
foreach (array("a", "b", ..., "z") as $elem) {
$$elem ??= [];
}
Что мне не нравится в описанном выше подходе, так это то, что я передаю в функцию foreach список строк, а не список переменных — это было бы неудобно, если бы имена переменных изменились. Есть ли другое более удобное решение?
В текущей реализации имена переменных известны. Скорее всего, так и останется.
Когда вам приходится иметь дело с громоздким объемом отдельных переменных, возникает вопрос: «Почему бы не использовать массив для хранения всех переменных, чтобы вы могли пользоваться функциями массива и разумными методами итерации?»
Интересно, почему у вас возникла эта проблема XY. Можете ли вы объяснить, почему вы столкнулись с этой ненормальной проблемой индивидуальных переменных?
в php вы можете добиться этого, используя переменные переменные. вот более краткое и динамичное решение:
foreach (range('a', 'z') as $letter) {
${$letter} ??= [];
}
этот код динамически создает переменные от $a до $z и инициализирует их пустым массивом, если они еще не установлены. таким образом вам не нужно явно передавать список имен переменных. Вместо этого он динамически генерирует их на основе диапазона букв от «a» до «z».
У этого решения та же проблема, что и у предыдущего — было бы неудобно, если бы имена переменных изменились. В моем случае имена переменных a, ..., z на данный момент являются заполнителями.
Вы можете использовать списки аргументов переменной длины по ссылке: (PHP >= 7.4)
function defineVariables($default, &...$vars)
{
foreach($vars as &$v)
$v ??= $default;
}
defineVariables([], $a, $b, $c);
Я не могу заставить это работать. PHP-песочница
Это хорошо работает для меня. PHP Sandbox Кажется, большинство онлайн-анализаторов синтаксиса PHP не совсем это понимают.
У меня работает: 3v4l.org Игнорируйте отчет об ошибке в строке 6. Это тоже имеет смысл, если вы читаете код.
Хорошо. Это хорошее решение. Эту функцию также можно применить напрямую. PHP-песочница
Известны ли эти переменные ранее? Или вы ищете какое-то общее решение, позволяющее избежать неопределенных переменных?