троичный оператор — PHP: как выглядит двойное присваивание в longform?

Я даже не был уверен, как Google это. Как бы это заявление PHP было написано долго?

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

Подобные оптимизации заставляют экспертов чувствовать себя умными, а новички — действительно глупыми. Я почти уверен, что понимаю, каков будет результат, но, возможно, я ошибаюсь.

A: Это эквивалентно?

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

Б: Это эквивалент?

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

Какой правильный?

Через твиттер, кажется, Б эквивалентно.

Объявление о государственной службе

Напишите явно простой код. Не будь умным.

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;

демонстрация

2

Другие решения

Эквивалент это

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

Я не уверен, как тест для $products будет иметь смысл, так как двойное присваивание не возвращает логическое значение.

Смотрите здесь разницу между необработанными типами и объектами.
Многократные назначения переменных сделаны значением или ссылкой?

1

Когда вы пишете:

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

Хотя результат не будет отличаться.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector