stanislav-belichenko
@stanislav-belichenko
Backend PHP Developer

Как наиболее кратко и понятно передать в один аргумент функции одну из двух переменных, которые могут быть либо массивом, либо логическим выражением?

Всем привет. Возник интересный вопрос. Есть некая функция, в ней есть условно один аргумент:

function f($a) {
...
}

Вызов этой функции может происходить в нескольких местах кода, однако выбор переменной, которая передастся в аргумент данной функции, зависит только от самой переменой. При этом переменные могут быть либо массивом либо, например, объектом, либо принимать логическое значение. То есть, появляется несколько избыточный код:

// заранее известно, что одна из переменных будет массивом/объектом, а другая - true/false
if ($x) {f($x)}
else if ($y) {f($y)}

Однако хотелось бы увидеть что-либо вроде такого:

f($x || $y);

Но здесь происходит приведение к типам и в итоге мы получаем в теле функции в аргумент логическое значение, а именно true (оно там будет всегда, так как предыдущим кодом обеспечено, что одна из переменных массив/объект). Внимание, вопрос: возможна ли некая иная краткая запись, позволяющая так же красиво реализовать описываемое? Кроме использования краткой формы оператора "if else", естественно.

Пример для тестирования на phpfiddle.org.
  • Вопрос задан
  • 267 просмотров
Пригласить эксперта
Ответы на вопрос 3
artemgapchenko
@artemgapchenko
Возможно вы неправильно подходите к самой задаче. Я бы избавился вообще от функции, которая по понедельникам принимает boolean, по вторникам - массив, а по остальным дням недели - объект, так как эта функция берёт на себя слишком много ответственности, и перешёл бы вместо неё к трем разным функциям, первая из которых принимает в качестве аргумента boolean, вторая - массив, а третья - объект.
Код пишется не только для выполнения, но и для чтения другими разработчиками, и подобная функция явно не способствует скорости изучения кода и внесения в него изменений.
Ответ написан
@surgat
Может вам подойдет тернарный оператор

Причем короткая версия
f($x ?: $y)

В этом случает если $x имеет значение TRUE, то в f передастся $x и $y в другом случае.

Примеры
true ?: 'test' - будет true
false ?: 'test' - будет 'test'
'' ?: true - будет true
'test' ?: true - будет 'test'

// Комбинирование
false ?: [] ?: 'test' - будет 'test'
Ответ написан
@Arik
$x ? f($x) : ($y ? f($y) : null);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽