PHP:长格式的双重赋值是啥样的?

Posted

技术标签:

【中文标题】PHP:长格式的双重赋值是啥样的?【英文标题】:PHP: what does a double assignment look like in longform?PHP:长格式的双重赋值是什么样的? 【发布时间】:2016-03-06 06:11:23 【问题描述】:

我什至不知道如何谷歌这个。如何将这个 php 语句写成长格式?

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

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

A:这等价吗?

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

B:这是等价的吗?

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

哪个是对的?

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

公共服务公告

编写非常简单的代码。别傻了。

【问题讨论】:

$products = $this->getRecentlyViewedProducts(); $recentlyViewed = $products; 如果你想分配$this->getRecentlyViewedProducts(),如果它不为空,你可以这样做:$recentlyViewed = $this->getRecentlyViewedProducts() ? : 'other_value'; 这里省略第二个参数意味着如果它评估为真,将分配第一个。否则,将分配“other_value”。请记住,只有当方法返回空数组或 null/false/0/empty 字符串(如果最近没有查看)时它才会起作用。如果它返回,例如即使它实际上是空的,它也会评估为 true 的集合对象。 【参考方案1】:
$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,则结果将是第一个将打印array,另一个将打印1

那么什么相当于

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

将会

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

Demo

【讨论】:

【参考方案2】:

等价的就是这个

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

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

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

【讨论】:

你对双重分配是正确的。这让初学者感到困惑,因为通常会看到非显式三元组,例如: $x = $y === 1;这比明确的东西更难理解: $x = ($y === 1) ?真假;因此,我对上述内容的混淆以及不识别赋值的行为与比较运算符不同。 首先 PHP 中没有“三元”复数 :) 据我所知,只有一个三元运算符,即简写 if,之所以称为三元,是因为它需要 3 个操作数,条件和两个结果,一个用于true,一个用于false【参考方案3】:

当你写作时:

$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;

虽然结果不会不同。

【讨论】:

以上是关于PHP:长格式的双重赋值是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章

网卡地址 MAC格式是啥样的?

XML:dateTime的数据应该是啥样的

NodeJS 本机驱动程序上的示例 MongoDB 错误是啥样的?

云原生时代的分布式文件系统是啥样的?

ssm 后台我要接收一个ArrayList,前台应该怎么写?JSON是啥样的?

数据映射器通常是啥样的?