10

有时我很厌倦 PHP 总是希望它在三元运算符中完全引用,这会让你感到恐惧;

$qb->records[$k]['Claimed'] = ($qb->records[$k]['Claimed'] === 1 ? $qb->records[$k]['Claimed'] : '0');

有没有办法简单地引用当前修改的变量(对象)?例如;

$qb->records[$k]['Claimed'] = (self === 1 ? self ? '0');

请不要看代码本身。这与示例的代码工作无关。这纯粹是关于 SELF 引用的可能性,无需额外修改。一个DEFINE方法也不错,但我猜 PHP 不能制作复杂DEFINE的 s,例如,Objective-C 可以。

我也知道这样的风格;

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

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

4

5 回答 5

5

要回答原始问题:

在 PHP 中,您不能像在 Python 或其他语言中那样引用要为其分配值的变量。

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

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

如果计算 结果为 ,则表达式expr1 ?: expr3返回,否则返回。expr1expr1TRUEexpr3

所以你可以使用类似的东西:

$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']is时返回10否则返回。

于 2013-09-11T09:28:23.990 回答
1

另一个想法是制作一个可以解决问题的函数:

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

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

例子:

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

其余的确实:condition ?: else速记 if-else 是您将得到的最接近的...

于 2013-09-11T10:42:51.570 回答
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);
于 2013-09-11T09:51:10.907 回答
0

不幸的是,您无能为力。

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

$arr = ['foo' => ['bar' => 2]];

// Introducing $_ -- the parens are needed!
$arr['foo']['bar'] = ($_ = $arr['foo']['bar']) === 2 ? $_ : 0;
于 2013-09-11T09:43:36.107 回答
-1

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

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

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

于 2013-09-11T09:43:31.647 回答