#php #conditional-operator
#php #условный оператор
Вопрос:
У меня есть следующее условие:
if (isset($x)){
$y_class = 'new value';
}else {
$z_class = 'new value';
}
Могу ли я изменить вышеуказанное if
условие на троичное? Под этим я подразумеваю, есть ли какой-либо способ присвоить ЛЕВОЕ ПРАВО?
Воображаемый код:
'new value' = (isset($x)) ? $y_class : $z_class;
Ответ №1:
Ну, если $y_class
и $z_class
жестко запрограммированы, вы можете сделать что-то подобное, но это просто сделает ваш код менее читаемым:
$var = isset($x) ? "y_class" : "z_class";
$$var = 'new value';
И, конечно, это все еще присваивание справа налево; насколько я знаю, в языке нет такого синтаксиса, который допускал бы присваивание слева направо.
Комментарии:
1. это нормально, но если
$y_class
и$z_class
не являются жестко запрограммированными, то2. Ну, они не обязательно должны быть жестко запрограммированы, вы также можете как-то «вычислить» имена переменных, но вы должны быть очень осторожны, чтобы не позволить пользователю манипулировать переменными, которые вы не хотите. Например, если имя переменной происходит из параметра GET и вы не проверяете его, вы практически разрешаете пользователю перезаписывать любую из ваших переменных.
3. Я присвоил этому 1, потому что это наиболее близко к тому, что вы пытаетесь сделать, но, честно говоря, я бы просто придерживался того
if/else
кода, который у вас есть, потому что этот синтаксис двойного доллара отвратителен; он почти так же плох, какeval()
в списке вещей, которые я никогда не хотел бы видеть в PHP-программе.
Ответ №2:
Вы могли бы сделать это : ${(isset($x)?$y_class:$z_class)} = 'new value';
Обязательная ссылка на документацию php о переменных variables.
Комментарии:
1. именно то, о чем я думал .. 1 за то, что ты быстрее меня
Ответ №3:
Вот самая чистая реализация, которую я мог создать. (По сути, комбинация двух лучших ответов).
${(isset($x) ? 'y':'z'). '_class'} = 'new value';
Изначально я думал использовать list()
языковую конструкцию, она не такая маленькая, но я все равно ее реализовал.
list($y_class, $z_class) = isset($x) ? ['new value', $z_class] : [ $y_class, 'new value'];
Если возможно, что $ y_class или $ z_class не заданы, тогда вам придется выполнить
list($y_class, $z_class) = isset($x) ? ['new value', isset($z_class) ? $z_class : null] : [ isset($y_class) ? $y_class : null, 'new value'];
оба примера со списком приведут к тому, что обеим переменным будет присвоено значение.