PHP使用类名作为变量字符串调用类方法

时间:2014-04-10 21:35:38

标签: php class

我有一个类,我想从中调用一个函数,但是实例化的类变量是从字符串中获取的。

class Myclass
{
 public function myFunction($param1,$param2) {
  return 'blah';
 }
}

我正在尝试以下但它不起作用。来自以下日志文​​件的错误。

$myclass='myclass';
${$myclass}=new ucfirst($myclass);
$args=array($stringvar,1);
$retval=call_user_func_array(array(${$myclass}, 'myFunction'), $args);

我做错了什么?

错误:

PHP Warning:  call_user_func_array() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in file.php on line 100
PHP Notice:  Undefined variable: myclass in file.php on line 134
PHP Fatal error:  Call to a member function myFunction() on a non-object in file.php on line 134

1 个答案:

答案 0 :(得分:0)

您使用类引用上的额外$ {}包围使其过度复杂化。

$myclass='myCLaSs';
$myObject = new $myclass();
$retval = $myObject->myFunction($stringvar, 1);

或者如果您需要使用call_user_func_array:

$args=array($stringvar,1);
$retval=call_user_func_array(array($myObject, 'myFunction'), $args);

使用$ {}包围时,您将通过变量名称引用变量。例如:

$myVariable = "A";
$aVariableThatIsHoldingAVariableName = "myVariable";
echo ${$aVariableThatIsHoldingAVariableName}; // outputs "A".

将此代码应用于您的代码会显示以下逻辑:

将变量$myclass设置为等于字符串' myclass'

$myclass='myclass';

设置变量${$myclass}

这将获取变量$myclass(' myclass')的值,并将其用作变量名称。换句话说,发生以下变量名称解析:${$myclass} => ${'myclass'} => $myclass

因此,此行将$myclass设置为new Myclass();对象:

${$myclass}=new ucfirst($myclass);

call_user_func_array的第一个参数是callable(参见http://us2.php.net/manual/en/language.types.callable.php)。您在此处尝试引用的回调是类型3:array($object, $method)。但是会发生相同的变量分辨率。现在,${$myclass}将以不同方式解析,因为$myclass的值是Myclass对象。 <变量名称必须是字符串,而不是对象(显然),因此${Myclass Object}完全无效。

$args=array($stringvar,1);
$retval=call_user_func_array(array(${$myclass}, 'myFunction'), $args);

但由于此时$ myclass已经是一个对象,你可以执行以下操作(如上所述):

$retval=call_user_func_array(array($myclass, 'myFunction'), $args);