Странное присвоение переменной - PullRequest
5 голосов
/ 04 сентября 2010

Я изучал какой-то код, который недавно нашел в сети, и наткнулся на этот синтаксис php:

<?php $framecharset && $frame['charset'] = $framecharset; ?>

Может кто-нибудь объяснить, что происходит в этой строке кода?Каким переменным (ам) присваивается какое значение (я) и какова цель оператора && в этом месте оператора?

Спасибо!Пат

Ответы [ 2 ]

3 голосов
/ 04 сентября 2010

Ах, я только что написал сообщение в блоге об этой идиоме в javascript:

http://www.mcphersonindustries.com/

В основном он проверяет, существует ли $framecharset, а затем пытается присвоить его $frame['charset'], если он не равен нулю.

Способ работает так, что переводчики ленивы. Обе стороны оператора && должны быть верны, чтобы продолжить. Когда он встречает значение false, за которым следует &&, он останавливается. Оценка не продолжается (поэтому в этом случае назначение не произойдет, если $framecharset равно false или null).

Некоторые люди даже помещают более «дорогую» половину логического выражения после &&, поэтому, если первое условие не true, то дорогой бит никогда не будет обработан. Можно спорить, сколько это на самом деле может сэкономить, но он использует тот же принцип.

2 голосов
/ 04 сентября 2010

&& в PHP короткозамкнут, что означает, что RHS не будет оцениваться, если LHS оценивается как false, потому что результат всегда будет false.

Ваш код:

$framecharset && $frame['charset'] = $framecharset;

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

if($framecharset) {
    $frame['charset'] = $framecharset;
}

, который присваивает значение $framecharset как значение ключу массива charset, только если значение оценивается как true и в PHP

Все строки истинны, кроме двух: строка вообще ничего не содержащая и строка, содержащая только символ 0

...