PHP noob:是否可以在没有警告的情况下测试未定义变量的相等性?

时间:2012-11-15 08:42:15

标签: php undefined equality

很抱歉,如果这是一个令人恼火的问题(我来自红宝石背景,我是PHP的新手)。

我发现你不能这样做有点奇怪:

 if($defined_array['undefined_index'] == 'a string') {
     do_something();
 }

没有被警告抨击。

  1. 在这种特殊情况下,如果变量不存在,你怎么得到警告?对于松散类型的语言,这是一种奇怪的平等实现。只获得false会更有意义。是否由于口译员的限制?这背后的技术原因是什么?我很好奇。
  2. 是否有任何我不知道的函数,构造,习语或其他任何东西会避免我每4行左右这样做:

    if(isset($defined_array['undefined_index']) && $defined_array['undefined_index'] == 'a string') {
         do_something();
    }
    

    我知道我可以声明我打算使用的每一个数组键,但是如果PHP打算在你每次使用它时打击你,那么在使用它们之前不要强制声明变量是什么意思?

6 个答案:

答案 0 :(得分:3)

警告的原因是出于代码安全原因。虽然数组键不存在的原因可能是因为在这种情况下没有提供它,但是在设置或检索元素时也可能存在拼写错误。如果没有警告,就很难注意到这种编码错误。

答案 1 :(得分:2)

不,没有相同的表达方式。但是,您可以创建自己的比较函数或使用(绝对可怕的)错误抑制运算符@。错误抑制总是一个坏主意,我建议你改为解决问题。

1:自己的功能:

function setAndEq($a, $b){
    if(isset($a, $b))
        return $a === $b;
    else
        return false;
}

if(setAndEq($array['undefined_index'], "hello")) {
    // hello
}

2:错误抑制:

if(@strcmp($array['undefined_index'], "hello") === 0) {

}

答案 2 :(得分:1)

这取决于,首先你可以转换你的error_reporting,但我不会推荐你。

当您对同一个数组键进行多次检查时,您也可以尝试这样做:

if (isset($defined_array['undefined_index'])) :
switch ($defined_array['undefined_index']) :
    case 'a string' :
        do_something();
    break;
    case 'b string' :
        do_anotherthing();
    break;    
endswitch;
endif;

在这种情况下,您不必担心每一行的所有警告。

答案 3 :(得分:1)

您可以通过设置适当的错误级别来消除警告,但这不是一个好主意。我个人使用一个小功能来轻松打字:

/**
 * nullsafe
 *
 * returns values from array like objects
 *
 * Usage:
 *    nullsafe($array, 'key'); - returns the $array['key'] if it is set
 *    nullsafe($array, 'key', 'foo'); - returns the $array['key'] if it is set, 'foo' otherwise
 *    nullsage($array, array('level0', 'level1')); returns $array['level0']['level1'] if it is set, null otherwise
 *
 * returns value indexed by $key from the $from, or the $default if its not present
 * if the key is an array then it will descend it into the $from like $from[$key[0]][$key[1]][$key[2]]...
 *
 * @param mixed $from
 * @param mixed $key
 * @param mixed $default
 * @return mixed
 */
function nullsafe($from, $key, $default = null) {
    if (!is_array($key)) {
        if (isset($from[$key])) {
            return $from[$key];
        }
    } else {
        foreach ($key as $k) {
            if (!isset($from[$k])) {
                return $default;
            } else {
                $from = $from[$k];
            }
        }
        return $from;
    }
    return $default;
}

答案 4 :(得分:1)

关于1: 当变量不存在时,您应该始终收到警告。它表示您没有正确编写代码。当未设置的变量(或数组键)评估为FALSE时,这将是错误的。 我想问题不在于技术原因 - 它只是常识。

关于2: 不。只需使用empty()isset()并使用严格的类型检查.. p.e. if ($x === FALSE)代替if ($x == NULL)

答案 5 :(得分:0)

修改:合并isseterror control operator您可以声明一个始终返回变量值的函数,如果未设置,则声明null

$ php -a
Interactive shell

php > function getvalue($var) {
php { return isset($var) ? $var: null;
php { }
php > $testarray['key1'] = "hello";
php > if ($myvar = @getvalue($testarray['key1'])) echo "var: " . $myvar;
var: hello
php > if ($myvar = @getvalue($testarray['key2'])) echo "var: " . $myvar;
php >

请注意,您无法区分不存在的变量或变量但变量值为null的变量。