2015-06-15 4 views
3

Люди, я сомневаюсь, что здесь я или мой компьютер здесь медленный.Странное поведение оператора if: всегда выполняется блок else

я следующий кусок кодирования:

class Whatever 
{ 
    ... 

    private function requireFile($filePath) 
    { 
     if(is_array($filePath)) 
      foreach($filePath as $singleFilePath) 
       if($this->requireFile($singleFilePath)) 
        break; 
     elseif(($filePath = stream_resolve_include_path($filePath = $filePath . '.php')) !== false) 
      return require_once $filePath; 
    } 
} 

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

Что происходит, когда при наличии массива в качестве параметра выполняются как блок if, так и блок elseif, и, таким образом, заставить PHP-парсер кричать, что он принимает массив для преобразования строк в строку elseif.

Я не понимая, почему добавление скобки if блока (поместив их вокруг foreach или внутри if ничего не меняет) делает все, чтобы работать как шарм, так как существует только один оператор ниже if и, таким образом, это не необходимо было их там:

class Whatever 
{ 
    ... 

    private function requireFile($filePath) 
    { 
     if(is_array($filePath)) { 
      foreach($filePath as $singleFilePath) 
       if($this->requireFile($singleFilePath)) 
        break; 
     } elseif(($filePath = stream_resolve_include_path($filePath = $filePath . '.php')) !== false) 
      return require_once $filePath; 
    } 
} 

Может ли кто-нибудь помочь мне здесь? Что не так в этом коде?

Редактировать: спасибо людям. Я думаю, ваши ответы доказывают, что это был я здесь медленный, ха-ха-ха. Месяцы далеко от программирования заставляет людей писать сумасшедшие вещи ...

+0

Вам, кажется, не хватает открывающего и закрывающего кронштейнов оператора 'foreach'. – Dorvalla

+0

Эти скобки не нужны, @Dorvalla, потому что в блоке 'foreach' есть только одна команда. –

ответ

3

Без скобки PHP парсер разбирает elseif заявление в связи с второйif, а не первый (внешний). Добавление скобок сообщает синтаксическому анализатору, что elseif принадлежит первому if.

PHP: не как Python, где отступы сообщают синтаксическому анализу отношение между операторами.

1

Я предполагаю, что когда вы кладете скобки вокруг оператора if, это работает. В любом случае, вот почему это не сработает.

  if($this->requireFile($singleFilePath)) 
       break; 
    elseif(($filePath = stream_resolve_include_path($filePath = $filePath . '.php')) !== false) 
     return require_once $filePath; 

elseif сгруппирован с последним if заявления встречающегося в этом случае внутренней if, вам нужно добавить скобки вокруг внешнего if явно указать анализатор, что else if принадлежит к внешнему, если не внутренним if. Отступы не имеют никакого значения в PHP.

В другом примечании у вас есть ненужное назначение в ветке elseif: $filePath = resolve_include_path($filePath = $filePath . '.php') может быть выполнено без второго присвоения $filePath = resolve_include_path($filePath . '.php').