标签:php
好吧,我有一个配置对象,其中包含各种对象的设置.我要实例化尚未创建的类的新对象时,便会在运行时生成我的类,因此,它们依靠config对象来了解哪些属性是必需的,以及其他一些信息:
大概是这样的:
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
}
}
}
}
}
尽管可以完成更多工作,但这可以完成工作.我一直在寻找更优雅的解决方案…
希望我不要混淆,谢谢您的帮助
解决方法:
我想到的唯一方法是向您的类添加类似于以下内容的函数
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,否则为null.您可以通过将功能更改为来检查值
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)]);
}
标签:php
来源: https://codeday.me/bug/20191201/2083741.html