PHP奇怪的if语句行为

时间:2012-02-19 04:10:41

标签: php function if-statement

public function genMenu($parent_id, $menu_type, $utype, $parent_token=0, $currentpage = 0) {
    $stmt = $this->db->prepare("SELECT n.page_id, p.short_name, p.token FROM navigation AS n, pages AS p, user_page_restr AS r WHERE n.parent_id = ? AND r.pg_id=p.id AND n.menu=? AND (r.user_type=? OR r.user_type=0)  AND n.page_id=p.id ORDER BY r.order") or die($this->db->error);
    $stmt->bind_param("iii", $parent_id, $menu_type, $utype) or die($stmt->error);
    $stmt->execute() or die($stmt->error);
    $stmt->store_result();
    $menu = array();
    $stmt->bind_result($menu['id'], $menu['short_name'], $menu['token']) or die($stmt->error);
    if ($stmt->num_rows > 0)
        echo "\n<ul>\n";
    while ($stmt->fetch()) {
        echo "<li ";
        if ($menu['token']==$currentpage) {
            echo 'class="active"';
        }
        echo ">";
        switch ($menu_type) {
            case 2:
                echo '<a href="?page=' . $parent_token;
                echo '&subpage=' . $menu['token'];
                echo '">' . $menu['short_name'] . '</a>';
                break;
            default:
                echo '<a href="?page=' . $menu['token'] . '">' . $menu['short_name'] . '</a>';
                break;
        }
        echo "</li>\n\n";
    }
    if ($stmt->num_rows > 0) 
        echo "</ul>\n";

    $stmt->close();
}

enter image description here

看看这个

        if ($menu['token']==$currentpage) {
            echo 'class="active"';
        }

即使$ menu ['token']是字符串且具有精确值且$currentpage为0,如果condition返回结果为true并在if(echo 'class="active"';)内执行表达式

有人可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:3)

我猜测PHP正在隐式地将字符串转换为int,这将导致比较0 == 0,这总是正确的。尝试使用严格相等运算符:

$menu['token'] === $currentpage

严格相等运算符的作用是比较类型的双方值。在您的情况下,由于0不是字符串,因此比较会立即返回false

答案 1 :(得分:2)

您有投射问题。将整数与带有==运算符的字符串进行比较时,字符串将转换为其等效整数,对于不以数字开头的字符串,该字符串为0。

答案取决于你想做什么。如果您只想将字符串与字符串匹配,请使用===运算符。

如果您希望空字符串匹配0,则可以使用

if ((string)$currentpage === $menu['token'])

确保比较是按字符串完成的,而不是默认的int到int。

答案 2 :(得分:0)

'new_mail'被强制转换为整数进行比较;变为0。

"new_mail" == 0 equals true