Предоставление PHP-тернарному оператору ссылки на себя
Я иногда очень устаю, что PHP всегда хочет, чтобы он полностью ссылался на тройного оператора, давая вам такие ужасы;
$qb->records[$k]['Claimed'] = ($qb->records[$k]['Claimed'] === 1 ? $qb->records[$k]['Claimed'] : '0');
Есть ли способ просто поставить ссылку на текущую измененную переменную (объект)? Например;
$qb->records[$k]['Claimed'] = (self === 1 ? self ? '0');
Пожалуйста, не смотрите на сам код. Это не о рабочем коде примера. Это чисто о возможности САМ-ссылки без дополнительной модификации. Метод DEFINE
тоже был бы хорош, но я думаю, что PHP не может сделать сложный DEFINE
, например, Objective-C.
Также я знаю такие стили;
foreach ($qb->records as $k => &$v) { ... }
.. но я не хочу этого метода в заранее определенном состоянии.
Ответы
Ответ 1
Чтобы ответить на исходный вопрос:
В PHP вы не можете ссылаться на переменную, которой вы назначаете значение, как вы, вероятно, на Python или на других языках.
Это говорит о том, что в PHP 5.3 они являются способом сокращения тройного оператора в определенных режимах использования. Из PHP Doc:
Начиная с PHP 5.3, можно исключить среднюю часть тернарный оператор.
Выражение expr1 ?: expr3
возвращает expr1
, если expr1
оценивается как TRUE
и expr3
в противном случае.
Итак, вы можете использовать что-то вроде:
$result = ($qb->records[$k]['Claimed'] ?: 0);
если вы хотите, чтобы значение от $qb->records[$k]['Claimed']
, когда это значение оценивается как TRUE
.
Кроме того, строго относящийся к первому примеру кода, в котором использовалось сравнение value === 1
и не имело никакого отношения к тернарному оператору, вы могли бы переписать условие как:
$result = (int) ($qb->records[$k]['Claimed'] === 1);
Это вернет 1
, когда $qb->records[$k]['Claimed']
будет 1
и 0
в противном случае.
Ответ 2
Другая идея - сделать функцию, которая делает трюк:
function setval(&$val, $desired, $default) {
if ($val != $desired) {
$val = $default;
}
}
$val
передается по ссылке, поэтому на него влияет функция; $desired
- желаемое значение сравнения; $default
- это значение, когда желаемое значение не выполняется.
Пример:
setval($qb->records[$k]['Claimed'], 1, '0');
В остальном: condition ?: else
стенограмма if-else ближе всего вы получите...
Ответ 3
К сожалению, вы ничего не можете сделать.
Лучшее, что я мог когда-либо получить, - ввести временную переменную inline, которая уменьшает количество вхождений вашей начальной переменной с трех до двух. Например:
$arr = ['foo' => ['bar' => 2]];
// Introducing $_ -- the parens are needed!
$arr['foo']['bar'] = ($_ = $arr['foo']['bar']) === 2 ? $_ : 0;
Ответ 4
SELF-referenced
Указатель, как вы описали, не существует. Если вам нужен более короткий код, вы можете сохранить ссылку с длинными именами в новую переменную $v
и использовать эту переменную в своих операторах if
:
$qb['records']['k']['Claimed'] = 'test';
$v = &$qb['records']['k']['Claimed'];
$v = $v === 'test' ? $v . ' extra' : null;
unset($v);
print_r($qb);
Ответ 5
Objective-C #define
представляет собой макрос , который использует материал из текущего контекста, чтобы вы могли определять различные ярлыки, включая определяющие константы, определяя вещи, которые выглядят как функции (но фактически заменены другим кодом).
PHP define()
- это функция с единственной целью инициализации констант.
Единственное сокращение PHP за то, что вы хотите выполнить, - это короткая форма тернарного оператора $x ?: NULL
.