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
并且其值 $recentlyViewed
是 0
、false
或 null
以外的任何值,则您的 if
条件将满足。
在 PHP 中使用非布尔值作为检查条件是很常见的,无论如何如果您使用 $recentlyViewed
作为标志,为了代码可读性和内存优化,最好这样做(注意如果您的函数返回例如一个大字符串,将其值复制到单独的变量中以将其用作标志不是明智的选择):
$recentlyViewed = $products ? true : false;
或
$recentlyViewed = $products ? 1 : 0;
虽然结果不会不同。
【讨论】:
以上是关于PHP:长格式的双重赋值是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章
NodeJS 本机驱动程序上的示例 MongoDB 错误是啥样的?