1

对不起,如果这是一个恼人的问题(我来自红宝石背景,我是 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 每次都打算给你一巴掌,那么在使用它们之前不被迫声明变量有什么意义呢?

4

6 回答 6

3

警告的原因是出于代码安全原因。虽然数组键不存在的原因可能是因为在此实例中未提供它,但也可能在设置或检索元素时出现拼写错误。如果没有警告,此类编码错误将更难被发现。

于 2012-11-15T09:16:34.963 回答
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) {

}
于 2012-11-15T08:57:16.703 回答
1

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

关于 2:不。只需使用empty()orisset()并使用严格类型检查.. peif ($x === FALSE)而不是if ($x == NULL).

于 2012-11-15T09:15:42.640 回答
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;
}
于 2012-11-15T08:52:19.703 回答
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;

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

于 2012-11-15T08:48:03.230 回答
0

编辑:结合isset错误控制运算符,您可以声明一个始终返回变量值或未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

于 2012-11-15T08:47:08.687 回答