2016-11-24 4 views
5

Я программировал в php около 2 лет.Синтаксис Strange for loop

Я просто наткнулся на этот цикл:

// Check the URI namespace for a context 
    $wsDir = basename(dirname(__FILE__)); 
    $uriArr = explode("/", $_SERVER['REQUEST_URI']); 

    for (
     $i = 0, $uriSize = sizeof($uriArr); 
     $i < $uriSize && $uriArr[$i] != $wsDir && $i++; 
    ); 

    $i++; 
    self::$executionContext = isset($uriArr[$i]) && !empty($uriArr[$i]) && substr($uriArr[$i], 0, 1) != '?' 
     ? strtoupper($uriArr[$i]) : 'SOAP'; 

, и я понятия не имею, как это должно работать.

Может кто-нибудь объяснить это мне?

+5

Если вы найдете человека, который написал это, у меня есть несколько слов выбора для них: P. –

+0

Похоже, что он находит конечную позицию базового каталога в URI. Для цикла цикла не требуется блок, он будет выполнять первое выражение безусловным один раз. Затем он выполнит второе условие, пока оно истинно. Третье условие пустое, что означает, что он ничего не выполняет. –

+0

[PHP Docs] (http://php.net/manual/en/control-structures.for.php) показывает в примере 4, что его можно использовать без блока оператора. –

ответ

3

Coming поздно, но никто, кажется, не кэшируются это: этот цикл эквивалентен:

$i = 1; 

Почему? Потому что в состоянии части для цикла, то есть 3 условия, которые связаны с AND:

$i < $uriSize 
&& 
$uriArr[$i] != $wsDir 
&& 
$i++; 

В первой итерации, $i++ значение 0, что эквивалентно ложным, и увеличивается только после. Таким образом, цикл останавливается только после одной итерации, а $i - 1, и у вас есть ошибка. Если это не опечатка в вашем коде ...

+0

: -O Вы гений! – sidyll

+0

Поздно с моей стороны. После этого я смотрел на код, и я тоже это увидел. Спасибо. На самом деле это правильный ответ. –

7

Это обычная трехсекционная петля без основного оператора и пустой третьей части.

От manual:

for (expr1; expr2; expr3) 
     statement 

Первое выражение (expr1) вычисляется (выполняется) один раз безоговорочно в начале цикла.

В начале каждой итерации оценивается expr2. Если он оценивает значение TRUE, цикл продолжается и выполняется вложенный оператор (ы). Если он вычисляет значение FALSE, выполнение цикла завершается.

В конце каждой итерации оценивается (выполняется) expr3.

Итак:

for (
    # initializes two variables 
    $i = 0, $uriSize = sizeof($uriArr); 

    # conditional, expr2 
    $i < $uriSize && $uriArr[$i] != $wsDir && $i++; 

    # no expr3 
); 

expr2 Если имеет значение истинно, цикл продолжается. Конечно, нет инструкции или блока для выполнения, поэтому она просто перескакивает на следующий итерарион, то есть expr2 будет выполняться несколько раз, пока в какой-то момент не будет считаться false.

Как указано R. Chappell в комментариях, это, вероятно, найти позицию в строке. Вы можете переписать это с подобной логикой, но в более «описательной» путь:

$uriSize = sizeof($uriArr) 

for ($i = 0; $i < $uriSize; $i++) { 
    if ($uriArr[$i] == $wsDir) break; 
} 

# now $i will be the index of the first $wsDir occurrence in the $uriArr array 
+0

Это на самом деле, это действительно ясно для меня. Спасибо @sidyll –

+0

Спасибо @VasilShaddix, счастлив, что теперь это более ясно. Я только что обновил ответ с помощью перезаписи – sidyll

+1

Спасибо за упоминание :) –

2

Это еще один пример (не ответ как таковой) использования для без третьего заявления. Это немного яснее первоначального вопроса.

for ($i=0; $i >= $i++ && $i <= 10; /* third statement */); 
echo $i; 

Это будет в основном рассчитывать на 10 и эхо его, и это стало возможным только с increment оператора в PHP.

Сначала мы установили $i в ноль;

Во-вторых, мы проверяем и увеличиваем $i, чтобы обеспечить его равным или больше, чем он сам в то время меньше или равно 10.

В-третьих, мы не делаем ничего ... нет смысла на самом деле ...

Однако, нормальные люди будут писать то же самое, как:

for ($i = 0; $i <= 10; $i++); 
echo $i; 

вы должны представить себе лучше использовать случай, хотя и да, вы можете просто $i = 10;, но это не идет так далеко, чтобы объяснить этот вопрос.