我有时会感到非常厌倦,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
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
。
另一个想法是创建一个函数来解决问题:
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
的缩写形式。