PHP:双重赋值在长格式中是什么样子的?

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

我什至不确定如何 Google 这个。这个 PHP 语句如何写成长格式?

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

这样的优化,高手觉得很聪明,新手觉得很傻。我很确定我明白结果是什么,但也许我错了。

答:这等价吗?

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

B:这等价吗?

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

哪个是对的?

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

Public服务公告

编写非常简单的代码。别耍小聪明了。

相当于这个

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

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

在这里查看原始类型和对象之间的区别。
Are multiple variable assignments done by value or reference?

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

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

I think this is equivalent:

不,它不等价。

让我们看看区别

$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$recentlyViewed,那么结果将是第一个打印 array,另一个打印 1

那么

相当于什么
$recentlyViewed = $products = $this->getRecentlyViewedProducts();

将会

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

Demo

当你写:

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

PHP所做的是从右手乞讨并将最右边的值分配给左侧变量(如果有)。该值可以是常量值(即字符串或数字)、另一个变量或函数的 return 值(在本例中为 $this->getRecentlyViewedProducts())。所以这里是步骤:

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

因此,如果我们假设您的 getRecentlyViewedProducts 函数 returns 'Hello Brendan!',在执行结束时,$products$recentlyViewed 将具有相同的值.

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

if($recentlyViewed) { ... }

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

$recentlyViewed = $products ? true : false;

$recentlyViewed = $products ? 1 : 0;

尽管结果不会有所不同。