Должен ли мой оператор if работать правильно, правильно ли он структурирован? - PullRequest
1 голос
/ 06 июня 2010
if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile)) && $_SERVER['REQUEST_URI'] != "login" || "thankyou" || "confirm") 

Должен ли этот код работать, операторы и синтаксис?

Ответы [ 2 ]

8 голосов
/ 06 июня 2010

Эта часть не будет работать так, как вы (вероятно) хотите:

$_SERVER['REQUEST_URI'] != "login" || "thankyou" || "confirm"

Во-первых, REQUEST_URI никогда не будет равно ни одному из этих значений - у него будет хотя бы дополнительная /. Если ваш скрипт называется test.php, REQUEST_URI будет содержать не менее /test.php (см. Ниже, что еще он может содержать). Взгляните на переменную REQUEST_URI, чтобы увидеть, как она структурирована.

Кроме того, REQUEST_URI здесь коварен: он будет содержать любые дополнительные строки запроса, поэтому можно будет спутать сравнение, добавив произвольный ?name=value к URL.

Сделайте phpinfo(), чтобы найти что-то более подходящее, чем REQUEST_URI, например SCRIPT_NAME.

Во-вторых, выполняемые вами операции «или» будут применены к значениям до того, как будет выполнено сравнение.

Вы, вероятно, хотите что-то вроде этого:

!in_array($_SERVER['SCRIPT_NAME'], 
          array("/login.php", "/thankyou.php", "/confirm.php"))
1 голос
/ 06 июня 2010

Даже если бы это было так, я бы создал метод для такого рода «сложных» условий.

Тело методов будет выглядеть примерно так:

if(!condition1)
  return false;

if(!condition2)
  return false;

if(!conditionN)
  return false;

return true;

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

...