2012-01-24 99 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,並且必須保持一致。猜猜誰是誰必須遵守的失敗者? :) –