2012-01-24 61 views
3

嗯,我有一个配置对象,其中包含各种对象的设置。我的类是在运行时生成的,因为我想要初始化一个尚未创建的类的新对象,因此它们依赖于配置对象来知道哪些属性是必需的,以及其他一些信息: 认为它有点像这样的:PHP isset - 测试不区分大小写

Config 
    ->Class1 
     ->Attributes 
      ->id 
       ->Mandatory: true 
      ->imagesource 
       ->Mandatory: true 
      ................. 
    ->Class2 
    .......................... 

我有检查,如果强制值都设置为对象,像一个方法,validateObject():

function validateObject($object){ 
    $config = configObject[get_class($object)]; 
    foreach($config->attributes as $attrName => $attrVal){ 
     if($attrVal->mandatory == true){ 
     if(!isset($object->$attrName){ 
      throw Error(); 
     } 
     } 
    } 
} 

到目前为止,一切都很好。恰巧现在,我的配置对象将属性名称变成了camelCase。我决定让程序员使用他们希望的任何外壳,最后,我只想检查对象是否具有任何属性,该属性转换为小写,会将Config上的属性转换为小写。

我目前的解决办法是像

function validateObject($object){ 
    $config = configObject[get_class($object)]; 
    foreach($config->attributes as $attrName => $attrVal){ 
     if($attrVal->mandatory == true){ 
     $lowercaseAttr = str_to_lower($attrName); 
     foreach($object as $key => $value){ 
      if(str_to_lower($key) == $lowercaseAttr){ 
       //don't throw, move to the next attribute in config 
      } 
     } 
     } 
    } 
} 

这将做的工作,但它需要更多的工作。我一直在寻找一个更好的解决方案...

我希望我不是混乱的,感谢您的帮助

+0

..strtolower()? –

+0

也许你应该将所有属性转换为一种情况(可能是小写)。 – Oyeme

+0

我不想那样做,因为程序员会失去它的踪迹。 :) –

回答

2

我能想到这样做的唯一方法是一个函数类相似添加到

public function check($p){ 
    $props =get_object_vars($this); 
    $array_to_search; 
    foreach($props as $key=>$prop){ 
     $array_to_search[strtolower($key)] = strtolower($key); 
    } 
    echo "prop :".array_key_exists(strtolower($p),$array_to_search); 
} 

,然后调用

$obj->check("thingtwo"); 

阵列位大概可以进行优化,我只是把它们放在一起,看看它是否适合你。如果你有一些类则此功能可以坐下分开,你可以通过在一个对象

function check($obj,$p){ 
    $props =get_object_vars($obj); 
    $array_to_search; 
    foreach($props as $key=>$prop){ 
     $array_to_search[strtolower($key)] = strtolower($key); 
    } 
    echo "prop :".array_key_exists(strtolower($p),$array_to_search); 
} 

    check($myobj, "propertyname"); 

如果属性存在,但空上面将返回true。您可以通过改变功能

function check($obj,$p){ 
    $props =get_object_vars($obj); 
    $array_to_search; 
    foreach($props as $key=>$prop){ 
     $array_to_search[strtolower($key)] = $prop; 
    } 
    echo "prop :".isset($array_to_search[strtolower($p)]); 
} 
+0

'$ array_to_search;'这个结构做了什么? – meze

+1

它只是一个由所有属性填充的数组。 Prob可以将它明确地强制转换为数组 $ array_to_search = new Array(); 但正如我所说,我只是有时间快速把它放在一起,并测试 – TommyBs

+0

建设'$ array_to_search;'实际上什么也没有和毫无意义。你应该总是明确地说它是一个数组''array_to_search = array();' – meze

1

数组键在PHP检查值是大小写敏感的,你也知道,所以当开发者犯错,比如复制现有的设置,会发生什么?

一些自定义配置:

$attributes = array(
    'settingOne' => array(/* stuff */), 
    // ... 
    'settingone' => array(/* different stuff */) 
); 

现在,当开发商去尝试和编辑设置,他可以编辑settingOne,或者他可以编辑settingone。如果他碰巧没有编辑你的代码正在读取的那个(这可能总是数组中的第一个),那么他的更改将不起作用,并且他很难发现他手上的错误。

这是你的设计,但如果我以这种方式做某件事情,我会要求配置数组密钥匹配正好我期望他们是。这可以在您创建的任何文档中明确强调,并解决所有问题,因为您可以简单地使用isset()。我认为大多数开发人员习惯了这种方法,因为这是大多数现有API的工作原理。

+0

这很有道理。不过,我的问题来自另一个来源。我的所有文档,所有使用这些文档的人都使用小写字母。如果我像你说的那样改变它,每个人都必须改变一切。我试图做到这一点的方式,它带来了这个怪癖,但程序员有责任坚持第一选择。 –

+0

如果他们现在都使用小写字母,而又不想让他们更改,那么为什么不把它改为小写字母?那么你仍然可以使用'isset()'。 – FtDRbwLXw6

+0

这是一个各种语言API的“合资企业”,我们有.Net,Java,PHP,Javascript,并且必须保持一致。猜猜谁是谁必须遵守的失败者? :) –