PHP:长篇的双重赋值是什么样子的?

PHP: what does a double assignment look like in longform?

提问人:Brendan Falkowski 提问时间:12/2/2015 最后编辑:Brendan Falkowski 更新时间:12/2/2015 访问量:123

问:

我什至不知道如何谷歌这个。这个PHP语句怎么写成长篇?

$recentlyViewed = $products = $this->getRecentlyViewedProducts();

像这样的优化让专家觉得自己很聪明,而初学者则觉得自己很愚蠢。我很确定我明白结果是什么,但也许我错了。

答:这是等价的吗?

$products = $this->getRecentlyViewedProducts();
$recentlyViewed = ($products) ? true : false;

B:这是等价的吗?

$products = $this->getRecentlyViewedProducts();
$recentlyViewed = $products;

哪个是对的?

通过 Twitter,似乎 B 是等价的。

公共服务公告

编写非常简单的代码。不要耍小聪明。

php 三元运 值运算符

评论

0赞 Tintu C Raju 12/2/2015
$products = $this->getRecentlyViewedProducts(); $recentlyViewed = $products;
0赞 Lanius 12/2/2015
如果你想分配 if 它不是空的,你可以这样做: 这里省略第二个参数意味着如果第一个参数的计算结果为 true,则将分配第一个参数。否则,将分配“other_value”。请记住,只有当该方法返回空数组或 null/false/0/空字符串(如果最近没有查看)时,它才会起作用。如果它返回,例如一个集合对象,即使它实际上是空的,它的计算结果也会为 true。$this->getRecentlyViewedProducts()$recentlyViewed = $this->getRecentlyViewedProducts() ? : 'other_value';

答:

1赞 Alex Andrei 12/2/2015 #1

等价物是这样的

$products = $this->getRecent();
$recentlyViewed = $products;

我不确定那里的测试是否有意义,因为双重赋值不会返回布尔值。$products

请参阅此处原始类型和对象之间的区别。
多个变量赋值是通过值还是引用完成的?

评论

0赞 Brendan Falkowski 12/2/2015
你对双重分配的看法是对的。这让初学者感到困惑,因为经常看到非显式三元,例如:$x = $y === 1;这比明确的东西更难理解:$x = ($y === 1) ?true : 假;因此,我对上述内容的混淆和不识别赋值的行为与比较运算符不同。
0赞 Alex Andrei 12/2/2015
首先,PHP中没有“ternaries”复数:)据我所知,只有一个三元运算符,简写,它被称为三元,因为它需要 3 个操作数、条件和两个结果,一个用于,一个用于。iftruefalse
2赞 Narendrasingh Sisodia 12/2/2015 #2
$recentlyViewed = $products = $this->getRecentlyViewedProducts();

$products = $this->getRecentlyViewedProducts();
$recentlyViewed = ($products) ? true : false;

我认为这是等价的:

不,它不是等价的。

让我们看看区别

$recentlyViewed = $products = range(1,10);

因此,如果您,则该值将为print_r

print_r($recentlyViewed);
print_r($products);

这将打印两个数组,但[1,2,3,....10]

$products = range(1,10);
$recentlyViewed = ($products) ? true : false;

因此,如果您打印 然后结果将是第一个打印一个,另一个将打印。$products$recentlyViewedarray1

那么相当于什么

$recentlyViewed = $products = $this->getRecentlyViewedProducts();

将是

$products = $this->getRecentlyViewedProducts();
$recentlyViewed = $products;

演示

0赞 Ehsan Khodarahmi 12/2/2015 #3

当你写的时候:

$recentlyViewed = $products = $this->getRecentlyViewedProducts();

PHP所做的是从右手乞求,并将最正确的值分配给左侧变量(如果有的话)。此值可以是常量值(即字符串或数字)、另一个变量或函数的返回值(在本例中)。因此,以下是步骤:$this->getRecentlyViewedProducts()

  • 计算 $this->getRecentlyViewedProducts() 的返回值(in this case)
  • 将计算值分配给$products
  • 分配给$product$recentlyViewed

因此,如果我们假设您的函数在执行结束时返回“Hello Brendan!”,则两者将具有相同的值。getRecentlyViewedProducts$products$recentlyViewed

在 PHP 中,变量类型是隐式的,因此您可以直接在如下语句中使用它们:if

if($recentlyViewed) { ... }

在这种情况下,如果设置了它,并且它的值是 ,或者 ,你的条件将满足。
在PHP中使用非布尔值作为检查条件是很常见的,无论如何,如果你只是作为一个标志使用,为了代码的可读性和内存优化,最好这样做(注意,如果你的函数返回一个大字符串,那么在单独的变量中复制它的值,把它作为一个标志使用,这不是一个明智的选择):
$recentlyViewed$recentlyViewed0falsenullif$recentlyViewed

$recentlyViewed = $products ? true : false;

$recentlyViewed = $products ? 1 : 0;

尽管如此,结果不会有所不同。