Обратное присвоение в PHP (СЛЕВА НАПРАВО)

#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'];
  

оба примера со списком приведут к тому, что обеим переменным будет присвоено значение.