2013-04-23 65 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