2010-12-30 2 views
2

Вот образец:Вопрос с установкой переменных в случае заявления

if(($test = array('key'=>true)) && $test['key']){ 
    // works 
} 
if($test = array('key'=>true) && $test['key']){ 
    // does not work 
} 

Почему требуется скобка? Я понимаю, что он вычисляет первое условное, а второе - не важно.

И «безопасно» выполнить задание следующим образом?

+0

Существует причина, по которой многие * современные * языки запрещают эту конструкцию и/или имеют соответствующую статическую типизацию для смягчения там, где она может укусить. В C, который использовался для записи, как Yoda, для улавливания ошибок: 'if (1 = x) {' - более современные компиляторы предупреждают, если нет внешнего '()', чтобы показать в намерении это назначение (это не означает, t изменить допустимую грамматику). С * возможным * исключением * idiomatic * while-readline (которое на самом деле в основном нарушено в PHP), я не вижу причин использовать этот синтаксис, подверженный ошибкам. Использование нескольких утверждений сделает намерение более ясным и покажет, «это то, что я хотел сделать». –

ответ

8

Это вопрос operator precedence на этом языке. В вашем втором заявлении, вы, по сути это пишу, чтобы оценить:

$test = array('key'=>true) && $test['key']; 

Просто о любом языке собирается принять, что значит:

$test = (array('key'=>true) && $test['key']); 

Это присваивание $test значение из оценка логического && между двумя другими значениями. Таким образом, $test будет либо true, либо false при оценке.

+0

AH! Я даже об этом не думал. Duh. Благодарю. Я думал, что это '$ test = array()' THEN '$ test ['key']'. – Jason

+0

@ Джейсон: Небольшие недоразумения, подобные этому очень рано в моей карьере развития, привели меня к тому, что я был скован как сумасшедший и максимально ясный, о моем порядке операций. Иногда мои высказывания немного напоминают код Lisp, но нет никаких сомнений в том, что они делают :) – David

0

Это безопасно использовать, но в этом случае скобки необходимы для устранения неоднозначности. В operator precedence правила PHP означает, что вторая строка будет выполнена как:

if ($test = (array('key' => true) && $test['key'])) { .. } 

Так тест не будет массив, но BOOL.

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

0

Я не думаю, что в PHP необходимы парады. они находятся в JS.

зависит от того, что вы подразумеваете под «безопасным». оно работает. но некоторые утверждают, что это плохой стиль и делает менее понятным и менее ремонтируемый код. otoh, K & R положительно рекомендовал его. это меня не волнует, а иногда делает для более аккуратного кода.

+0

Скобки необходимы. Попробуй это. – Jason

+0

Скобки необходимы только при раздельном запуске. Если вы запускаете их один за другим, как вы показываете в своем примере, тогда второй будет оцениваться как истинный. – sberry

+0

@ sberry2A: Что не работает правильно, это назначение. – webbiedave

0

Это потому, что он заставляет интерпретатор выполнять задание, прежде чем он попытается оценить какие-либо условия внутри if.

Без круглых скобок вы просто присваиваете результаты array('key'=>true) && $test['key'] в $ test.

0

В PHP оператор присваивания = имеет более низкий приоритет, чем большинство других операторов. (Для получения дополнительной информации см. documentation). Кроме того, результатом выражения с использованием оператора присваивания является значение присваивания. Имея это в виду, рассмотрим выражения вы разместил:

Первый пример:
($test = array('key'=>true)) && $test['key'] Первая часть этого выражения, ($test = array('key'=>true)) вычисляет array('key'=>true) (по указанному выше правилу), а вторая часть имеет значение true с ключом был просто установлен. Таким образом, все выражение оценивается как true.

Второй пример:
$test = array('key'=>true) && $test['key'] По правилам приоритета операторов, $test собирается получить присваивается значение выражения array('key'=>true) && $test['key'].Первая половина этого вопроса верна, но $test['key'] еще не установлен, поэтому true && false является ложным, поэтому $test принимает значение false, что также является результатом условия if.

Смежные вопросы