PHP:longform中的双重赋值是什么样的?

时间:2015-12-02 05:10:38

标签: php ternary-operator assignment-operator

我甚至不确定如何谷歌这个。如何将这个PHP语句写成longform?

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

这样的优化让专家感到聪明,初学者感到非常愚蠢。我很确定我明白结果是什么,但也许我错了。

答:这是等同的吗?

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

B:这是等效的吗?

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

哪个是对的?

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

公共服务公告

写出明显简单的代码。不要聪明。

3 个答案:

答案 0 :(得分: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$recentlyViewed,则结果将是第一个' ll打印array,另一个' ll打印{{1} }。

那么相当于

1

将是

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

Demo

答案 1 :(得分:1)

等效于此

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

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

请参阅此处原始类型和对象之间的区别 Are multiple variable assignments done by value or reference?

答案 2 :(得分:0)

当你写:

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

PHP所做的是从右手乞求并将最正确的值分配给左侧变量(如果有的话)。该值可以是const值(即字符串或数字),函数的另一个变量或返回值(在这种情况下为$this->getRecentlyViewedProducts())。所以这是步骤:

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

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

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

if($recentlyViewed) { ... }

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

$recentlyViewed = $products ? true : false;

$recentlyViewed = $products ? 1 : 0;

althogh结果不会有所不同。