array_key_exists在直接调用方法时正常工作,但在通过另一个方法调用时则不能

时间:2011-03-31 22:11:40

标签: php

我在找出为什么下面的代码提取不能达到预期效果时遇到了一些麻烦。将设置字符串立即传递给settingIsProtected时,如果设置受到保护(在数据数组中具有前导下划线),则函数会正确返回。但是当通过getAll调用该方法时,如果永远不会超过第一个if语句。

非常感谢,谢谢!

<?php
class Config
{

    private static $data = array(
        'foo' => 'bar',
        '_baz' => 'qux'
    );

    public static function getAll($filterProtected = TRUE)
    {
        if ($filterProtected == TRUE) {
            $filtered = array();
            foreach (self::$data as $key => $value) {
                if (self::settingIsProtected($key) == TRUE) {
                    $filtered[$key] = $value;
                }
            }
            return $filtered;
        } else {
            return self::$data;
        }
    }

    public static function settingIsProtected($key)
    {
        if (array_key_exists($key, self::$data)) {
            return FALSE;
        } else if (array_key_exists('_' . $key, self::$data)) {
            return TRUE;
        } else {
            return NULL;
        }
    }

}

var_dump(Config::settingIsProtected('foo'));    // prints false
var_dump(Config::settingIsProtected('baz'));    // prints true
var_dump(Config::getAll(FALSE));                // prints an array with foo and _baz
var_dump(Config::getAll(TRUE));                 // prints empty array
?>

4 个答案:

答案 0 :(得分:1)

settingIsProtected()中的第一个返回语句从return FALSE;更改为

return ($key[0] === '_');

这意味着如果传入方法的密钥存在于数组中;然后以下划线开头,然后返回TRUE,否则FALSE

答案 1 :(得分:0)

getAll(TRUE)中,您循环遍历$ data中的所有键,这意味着在settingIsProtected($key)中您正在检查位中的变量__baz

} else if (array_key_exists('_' . $key, self::$data)) {

尝试在设置IsProtected中放置一个echo $键,你会明白我的意思。

答案 2 :(得分:0)

getAll()中对self :: settingIsProtected($ key)的调用将始终返回false,因为传递给它的键是'_baz'...和array_key_exists($ key,self :: $ data)在setsIsProtected()中将此标识为现有(因为它确实存在),并返回FALSE。

修改

if (self::settingIsProtected($key) == TRUE) 

在getAll()中

if (self::settingIsProtected(trim($key,'_')) == TRUE) 

答案 3 :(得分:0)

要测试baz是否为受保护密钥,您可以执行settingIsProtected('baz')。但是,getAll会对$data的键进行迭代,因此它会settingIsProtected('_baz')。这是一个小问题。