如何避免IF语句冲突,以及如何选择哪一个具有优先级


How do I stop my IF statements from conflicting and how do I choose which one has priority?

我是PHP的新手,有人要求我编写一个基于时间显示图像的脚本。我已经扣除了我需要使用PHP的原生"日期"函数,直到我被要求在其中实现银行假日和圣诞节,一切都很顺利。

我试图将圣诞节和银行假日作为一个单独的if语句添加进来,但那是灾难发生的时候,我一直不明白为什么它会停止。我尝试过使用在线PHP验证器,但没有成功。

请不要害怕向我抛出细节和行话,因为我真的希望在未来扩大我的PHP知识,减少对网络论坛支持的依赖!

这是代码:

<?php
        // Date-time (day of month, month) 
        $d = date('j'); // Day of month: Numeric without leading zeroes
        $m = date('n'); // Month: As above
        $D = date('w'); // Day of week
        $H = date('G'); // Hour of day
        // REGULAR OPENING TIMES
        // Closed before 9am on weekdays
        if ($H < 9 && $D <= 5) :
                $showroom_img = '/media/gbu0/pagehead/showroom_closed.jpg';
        // Open before 5pm (but after 9, as first if statement overrides this) on weekdays
        elseif ($H < 17 && $D <= 5) :
                $showroom_img = = '/media/gbu0/pagehead/showroom_open.jpg';
        // Closed before 10am on Saturdays
        elseif ($H < 10 && $D == 6) :
                $showroom_img = = '/media/gbu0/pagehead/showroom_closed.jpg';
        // Open between 10am and 2pm on Saturdays
        elseif ($H < 14 && $H > 10 && $D == 6) :
                $showroom_img = = '/media/gbu0/pagehead/showroom_open.jpg';
        // Any other time, display closed image :)
        else :
                $showroom_img = = '/media/gbu0/pagehead/showroom_closed.jpg';
        endif;
        // Holidays 2014
        $xmas_starts = ($d == 23 && $m == 12 && $d > 17);
        $xmas_ends   = ($d == 26 && $m == 12);
        $nyd         = ($d == 1 && $m = 1);
        // Easter Friday: April 18
        // Easter Monday: April 21
        // Early Spring B/H: May 5
        // Late Spring B/H: May 26
        // Summer B/H: August 25
        // All bank holidays: 10am - 2pm
        if( date >= $xmas_starts && $day <= $xmas_ends ) :
                $xmas = true;
        elseif( date = $nyd ) :
                $nyd = true;
        else :
                $bankhol = false;
        endif;
        if( $xmas = true ) :
                $showroom_img = "/media/gbu0/pagehead/showroom_xmas.jpg";
        elseif( $bankhol = true && date('F', 'j') = strpos('April 18' || 'April 21' || 'May 5' || 'May 26' || 'August 25') || date('w') = 6 ) :
                $showroom_img = "/media/gbu0/pagehead/showroom_bhol.jpg";
        elseif( date('w') = 7 ) :
                $showroom_img = "/media/gbu0/pagehead/showroom_closed.jpg";
        else :
                $showroom_img = "/media/gbu0/pagehead/showroom_open.jpg";
        endif;
?>

首先。我注意到几个错误:

elseif( date = $nyd ) :
                $nyd = true;

if( $xmas = true ) :
                $showroom_img = "/media/gbu0/pagehead/showroom_xmas.jpg";

在PHP中,'='是赋值运算符,用于为变量赋值。这里需要的是比较运算符'=='。例如:

if( $xmas == true ) :

或者你也可以这样做(已经在评论中指出了):

if( $xmas ) :

根据优先级,if语句将按照您在代码中写入它们的顺序进行检查。为了确保某个条件获得最高优先级,必须首先对其进行检查。

您是否考虑过使用switch case函数而不是elseif?

切换案例方法:

switch ($i) {
case 0:
    echo "i equals 0";
    break;
case 1:
    echo "i equals 1";
    break;
case 2:
    echo "i equals 2";
    break;
}

点击此处阅读更多信息:http://www.php.net/manual/en/control-structures.switch.php

if语句不能冲突,也没有优先级的概念。每一个都按照它出现的顺序进行评估和执行,除非它被代码分支跳过(例如,如果同一链中的前一个ifelseif被评估为true,则elseif将被跳过)。

问题的原因很可能是您混淆了赋值运算符和相等运算符(===)。

在所有情况下,x = y都是一个赋值;即它将CCD_ 8的值分配给变量CCD_。即使你把它放在if语句中,情况也是如此,所以它通常是你想要避免的(尽管在某些情况下它很有用)。

在所有情况下,x == y都是相等的比较;即它检查CCD_ 12的值是否与CCD_。这是在if条件下通常需要的。

换句话说,你想改变这个:

if( $xmas = true )

对此:

if( $xmas == true )

你也需要在其他几个地方做同样的事情。