问题已经被具体定义了,已经抽取成文件,文件下载链接。
https://pan.baidu.com/s/1jHYa0cQ
精简问题
我封装了一个类,这个类(A)有个方法(f)。
这个方法A::f中通过call_user_func_array函数调用了另一个类(B)对象(b_obj)的方法(f),实际参数通过在A::f()中调用func_get_args()给call_user_func_array。
可结果在B::f()中收到的参数被嵌套了,不明白的话,具体的情况见下面的事例代码来说吧。
大家可以把下面这段代码复制执行后,得到的结果是正确的结果。我现在的一个实际的问题注释中写了
//Example:
class B
{
public function f($param1 = null)
{
var_dump($param1);
}
}
class A
{
private $obj = null;
public function __construct()
{
$this->obj = new B();
}
public function f()
{
return call_user_func_array(array($this->obj,__FUNCTION__),func_get_args());
}
}
$a_obj = new A();
$a_obj->f('name','zhangsan');
/**
*=======问题说明========
*
//结果实际的情况输出是这样的,现在这里的代码为精简,我说明情况用的
array(2){
0 => 'name',
1 => 'zhangsan',
}
//本来这种正常情况是这样的
string('name');
======================*/
请问这是怎么一回事?有人遇到过么?上面精简的代码我测试过了结果会是正常的。我的显示情况是这种的精简版,我也一层层调试了,不得其解。(在具体的代码如下)
具体
//first控制器中
public function v()
{
$view = new \core\View();
$view->assign('name','zhangsan');
}
//second View中
public function __call($method, $arguments)
{
/*
dump(array(
'method' => $method,
'args' => $arguments));
die();*/
// TODO: Implement __call() method.
if($this->instance &&
method_exists($this->instance,$method)
)
{
return call_user_func_array(array($this->instance,$method),$arguments);
}
}
//third 最底层了
public function assign($tpl_var, $value = null, $nocache = false)
{
dump(func_get_args());
die();
if (is_array($tpl_var)) {
foreach ($tpl_var as $_key => $_val) {
$this->assign($_key, $_val, $nocache);
}
} else {
if ($tpl_var != '') {
if ($this->_objType === 2) {
/** @var Smarty_Internal_Template $this */
$this->_assignInScope($tpl_var, $value, $nocache);
} else {
$this->tpl_vars[ $tpl_var ] = new Smarty_Variable($value, $nocache);
}
}
}
return $this;
}
//输出
array(2) {
[0] => string(4) "name"
[1] => string(8) "zhangsan"
}
array(1) {
[0] => array(2) {
[0] => string(4) "name"
[1] => string(8) "zhangsan"
}
}
func_get_args — 返回一个包含函数参数列表的数组,当然返回给你了一个数组
而不是字符串
name