Предоставление 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.