让 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不能像Objective-C那样制作复杂的DEFINE

我也知道这样的风格;

foreach ($qb->records as $k => &$v) { ... }

..但我不希望该方法处于预定义状态。

要回答原始问题:

在PHP中,你不能引用你赋值的变量,就像你在Python或其他语言中所做的那样。

话虽如此,在 PHP 5.3 中,它们是在某些用法中缩短三元运算符的一种方法。来自 PHP 文档 :

从 PHP 5.3 开始,可以省略中间部分 三元运算符。

表达式 expr1 ?: expr3 如果计算结果为 expr1则返回expr1 TRUEexpr3其他情况。

因此,您可以使用以下内容:

$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

另一个想法是创建一个函数来解决问题:

function setval(&$val, $desired, $default) {
    if ($val != $desired) {
        $val = $default;
    }
}

$val 是通过引用传递的,因此它受函数的影响; $desired是比较的期望值; $default是未满足所需值时的值。

例:

setval($qb->records[$k]['Claimed'], 1, '0');

对于其余的:condition ?: else速记if-else是你将得到的最接近的......

不幸的是,

你无能为力。

我能得到的最好的结果是引入一个内联的临时变量,它将初始变量的出现次数从三次减少到两次。例如:

$arr = ['foo' => ['bar' => 2]];
// Introducing $_ -- the parens are needed!
$arr['foo']['bar'] = ($_ = $arr['foo']['bar']) === 2 ? $_ : 0;

你描述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);

Objective-C #define是一个宏结构,它使用当前上下文中的内容来定义各种快捷方式,包括定义常量,定义看起来像函数的东西(但实际上被其他代码替换)。

PHP define() 是一个函数,其唯一目的是初始化常量。

您想要完成的唯一 PHP 简写是三元运算符 $x ?: NULL 的缩写形式。

最新更新