PHP将赋值变量设置为undefined - 它保持不变?

时间:2011-03-22 08:47:42

标签: php undefined undefined-behavior

我对我刚刚调试的一些行为有疑问,特别是如果已经设置的变量被分配给未定义的值会发生什么。我只是想检查一下,我正在理解发生了什么。如果变量已经设置了值,并且您尝试将其设置为未定义的值,那么它是否保持旧值?

具体来说,我有一些看起来像这样的PHP代码 - 假设$ string是1和2的字符串。

$array = array(1 => 'foo', 2 => 'bar');
for($count=0;$count<len($string);$count++)
{
    $newvar = $array[$string[$count]];
    if(!empty($newvar))
    {
       switch($newvar)
       {
             case 'foo':
                    // blah blah break;
             case 'bar':
                    // blah blah break;
       }
    }
}

现在,我的代码应该将$ string设置为类似“12212”的东西,但是我的错误是发送了一些带有额外空格的内容 - “12212”。这导致了一些异常行为,我认为发生了什么 - 当$ count = 5时,$ string [5]未定义,因此$ array [$ string [5]]未定义,$ newvar保持为2.因此我的如果(!空语句不能完成它的工作,并且案例'bar'发生的次数比它应该发生的次数多。这一切看起来都会发生吗?

当然,修剪$ string解决了我的问题,但我想确保我明白出了什么问题。如果这是一个愚蠢的问题,请道歉 - 我在这里只是一个业余爱好者....

编辑:这是实际的代码。 $ upstr应该是一串数字。

           $len = strlen($upstr);
           $cost=0;
           $upnames = array(4=>"man", 2=>"raw", 1=>"food", 3=>"fuel",5=>"tech");
           for($strloop=0;$strloop<$len; $strloop++)
           {
                 $number = $upstr[$strloop];
                 if(! empty($number))
                 {
                     $name = $upnames[$number];
                     $cost+= mysql_result($result1,0,$name) +1;
                     if(mysql_result($result2,0,$name."up")==1)
                     {
                         $cost+=100;
                     }
                 }
           }

当$ uptr在最后有一些额外的空格时发生的事情是我会看到一个mysql错误,它无法在$ result2中找到“up”列。所以它试图在if()语句中运行该代码块,其中$ name为空或NULL或其他东西。如果我故意添加3或4个额外的空格,我会看到很多mysql错误。

3 个答案:

答案 0 :(得分:2)

我担心变量$ array的定义在你的代码示例中是不正确的,它应该如下所示:

$ array = array(1 =&gt;'foo',2 =&gt;'bar');

如果将$ newvar设置为$ array的未定义元素(例如3),则$ newvar将设置为NULL。

答案 1 :(得分:0)

使用array_key_exists($array, $string[$count])检查您的数组是否具有密钥值。

答案 2 :(得分:0)

好的,我已经弄明白是什么导致了我看到的行为。字符串''和''在empty()下表现不同。其中一个被认为是空的而另一个不是,这让我感到困惑。非常感谢所有的帮助。