我的if语句是否有效,是否结构合理?

时间:2010-06-06 10:52:57

标签: php syntax operators if-statement

if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile)) && $_SERVER['REQUEST_URI'] != "login" || "thankyou" || "confirm") 

这段代码应该运行吗,运算符明智且语法明智吗?

2 个答案:

答案 0 :(得分:8)

这部分不会像您(可能)那样有效:

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

首先,REQUEST_URI永远不会等于这些值中的任何一个 - 它至少会有一个/。如果您的脚本名为test.php,则REQUEST_URI将至少包含/test.php(请参阅下面的其他内容)。查看REQUEST_URI变量,了解它的结构。

另外,REQUEST_URI在这里是危险的:它将包含任何其他查询字符串,因此可以通过向URL添加任意?name=value来混淆比较。

执行phpinfo()查找比REQUEST_URI更合适的内容,例如SCRIPT_NAME

其次,在比较完成之前,您正在执行的“或”操作将应用于值。

你可能想要这样的东西:

!in_array($_SERVER['SCRIPT_NAME'], 
          array("/login.php", "/thankyou.php", "/confirm.php"))

答案 1 :(得分:1)

即使它确实存在,我也会为这种“复杂”条件创建一种方法。

方法体看起来像这样:

if(!condition1)
  return false;

if(!condition2)
  return false;

if(!conditionN)
  return false;

return true;

编辑: 原因只是可读性,您可以恰当地命名这些条件方法,并且方法本身比非常长的if语句更具可读性。