我有时会非常厌倦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) { ... }
..但我不希望该方法处于预先定义的状态。
答案 0 :(得分:4)
回答原来的问题:
在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
。
答案 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
的简写形式。