Я даже не был уверен, как Google это. Как бы это заявление PHP было написано долго?
$recentlyViewed = $products = $this->getRecentlyViewedProducts();
Подобные оптимизации заставляют экспертов чувствовать себя умными, а новички — действительно глупыми. Я почти уверен, что понимаю, каков будет результат, но, возможно, я ошибаюсь.
$products = $this->getRecentlyViewedProducts();
$recentlyViewed = ($products) ? true : false;
$products = $this->getRecentlyViewedProducts();
$recentlyViewed = $products;
Через твиттер, кажется, Б эквивалентно.
Напишите явно простой код. Не будь умным.
$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;
Эквивалент это
$products = $this->getRecent();
$recentlyViewed = $products;
Я не уверен, как тест для $products
будет иметь смысл, так как двойное присваивание не возвращает логическое значение.
Смотрите здесь разницу между необработанными типами и объектами.
Многократные назначения переменных сделаны значением или ссылкой?
Когда вы пишете:
$recentlyViewed = $products = $this->getRecentlyViewedProducts();
PHP делает это, начиная с правой руки и присваивая наиболее правое значение левой переменной (если есть). Это значение может быть константным значением (то есть строкой или числом), другой переменной или возвращаемым значением функции ($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;
Хотя результат не будет отличаться.