2009-10-09 113 views
5

有没有可能通过字符串表示“调用”类实例?如何在PHP中“调用”类实例?

在这种情况下,我会想到的代码如下所示:

class MyClass { 
    public $attribute; 
} 

$obj = getInstanceOf("MyClass"); //$obj is now an instance of MyClass 
$obj->attribute = "Hello World"; 

我想这一定是可能的,因为PHP的SoapClient的接受它用于一个WSDL元素映射到PHP类classMappings列表。但SoapClient如何“调用”类实例?

回答

22
$class = 'MyClass'; 
$instance = new $class; 

但是,如果你的类的构造函数接受可变数量的参数,和你在一个数组持有这些参数(有点call_user_func_array),你必须使用反射:

$class = new ReflectionClass('MyClass'); 
$args = array('foo', 'bar'); 
$instance = $class->newInstanceArgs($args); 

有也是ReflectionClass::newInstance,但它与上面的第一个选项具有相同的功能。

参考:

+0

啊坦克,那么容易。 :-D 还有一个问题,是有办法测试,如果该类真的存在吗? Like: if(classExists(“MyClass”)){ $ obj = getInstanceOf(“MyClass”); } – NovumCoder 2009-10-09 09:18:57

+0

有'class_exists()':http://www.php.net/manual/en/function.class-exists.php。但请注意第二个参数。 – 2009-10-09 09:21:53

+0

谢谢你们。 ReflectionClass是完美的解决方案。那么我忘了这叫做Reflection not invoking。 :-) – NovumCoder 2009-10-09 09:36:50

6

如果通过构造函数需要的参数个数是已知的,恒定的,你可以(如其他人所说)做这样的:

$className = 'MyClass'; 
$obj = new $className($arg1, $arg2, etc.); 
$obj->attribute = "Hello World"; 

作为替代方案,您可以使用Reflection。这也意味着如果你不知道需要多少构造函数参数,你可以提供一个构造函数参数数组。

<?php 
$rf = new ReflectionClass('MyClass'); 
$obj = $rf->newInstanceArgs($arrayOfArguments); 
$obj->attribute = "Hello World"; 
6

其他的答案将在PHP < = 5.5的工作,但这个任务变得在PHP 5.6容易很多,你甚至不必使用反射。只要做到:

<?php 

class MyClass 
{ 
    public function __construct($var1, $var2) 
    {} 
} 

$class = "MyClass"; 
$args = ['someValue', 'someOtherValue']; 

// Here's the magic 
$instance = new $class(...$args); 
+0

这个答案需要更多upvotes。不知道直到今天“splat”运营商才存在! http://php.net/manual/en/migration56.new-features.php#migration56.new-features.splat – Andy 2017-02-12 17:14:45

相关问题