让PHP三元运算符引用自身

时间:2013-09-11 09:22:25

标签: php

我有时会非常厌倦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像,例如,Objective-C可以。

我也知道这样的风格;

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

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

5 个答案:

答案 0 :(得分:4)

回答原来的问题:

在PHP中,您无法引用要为其指定值的变量,就像您在Python或其他语言中所显示的那样。

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

  

从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

答案 1 :(得分: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是你最接近的...

答案 2 :(得分:0)

不幸的是,你无能为力。

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

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

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

答案 3 :(得分: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);

答案 4 :(得分:-1)

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

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

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