我有一个类,我想从中调用一个函数,但是实例化的类变量是从字符串中获取的。
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
答案 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);