2009-10-09 70 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

相關問題