2013-04-23 101 views
4

我遇到了一些問題。我有我的類名稱在一個變量中,我需要實例化它,但我無法知道我的變量具有與類完全相同的情況。以不區分大小寫的方式實例化一個類

例子:

//The class I'm fetching is named "App_Utils_MyClass" 
$var = "myclass"; 
$className = "App_Utils_".$var; 
$obj = new $className(); 

我怎樣才能使這項工作?

附加信息:

  • 我有這個片段之前class_exists()檢查(不區分大小寫),以確保我希望類確實存在。
  • 類名始終正確地駱駝式(例如MySuperAwesomeClass)。
+0

我使用class_exists(不區分大小寫)來檢查類是否實際存在 – 3rgo 2013-04-23 14:09:45

+0

就像拼寫應該是正確的,案例也應該是正確的。你怎麼會認爲拼寫是正確的,但可能是不正確的? – 2013-04-23 14:10:21

+0

@ Squ36,啊。所以class_exists()給出了true,但是如果case錯誤,實例化可能會出錯。這是你的問題嗎? – 2013-04-23 14:11:09

回答

8

與流行的觀點相反,PHP中的函數名不區分大小寫,對於類構造函數來說是相同的。您的case應該已經有效。試試這個

<?php 
class TestClass { 
    var $testValue; 
} 


$a=new testclass(); 
$b=new TestClass(); 
$c=new TESTCLASS(); 
print_r($a); 
print_r($b); 
print_r($c); 

?> 

根據PHP Manual

注:函數名是不區分大小寫的,但它通常是很好的形式調用函數,因爲他們出現在他們的聲明。

這也適用於你的類方法。

解決方法/更好的方式來命名這些類

下面將確保類名稱將永遠是準確的情況下,被你定義,無所謂其中case用戶輸入其

<?php  
class TestClass { 
    var $testValue; 
} 


$userEnteredValue="testCLASS"; 
$myClasses=get_declared_classes(); 
$classNameIndex=array_search(strtolower($userEnteredValue), array_map('strtolower', $myClasses)); 
if($classNameIndex!==FALSE) 
{ 
    $classNameShouldBe=$myClasses[$classNameIndex]; 
     echo $classNameShouldBe; 
} 
else 
{ 
    echo "This class is undefined"; 
} 




?> 
+0

嗨。我剛剛看到了!我確信類和方法名稱區分大小寫。感謝您的信息 – 3rgo 2013-04-23 14:19:01

+0

我真的不喜歡這種語言的功能,它可以爲糟糕的編碼做法留出空間,但是還有很多事情需要關注。使用這樣的名字是不可取的,但不幸的是你的問題的答案 – 2013-04-23 14:20:51

+0

是的,我知道。我喜歡乾淨的代碼,這迫使我違揹我的信仰,但我沒有選擇... – 3rgo 2013-04-23 14:25:34