2016-09-30 79 views
0

这里是一个变量,它的输出如下:为什么数组中的数据不能用于php的魔术方法__call()?

$a = [2, 3, 4]; 
echo implode(',', $a); 

输出

2,3,4 

我有一类与PHP魔术方法__call

class MagicMethod { 

    public function __call ($pm, $values) { 
     echo "there is not <b>$pm</b> method <br/> and arguments are <br/>"; 
     echo implode(',', $values); 
    } 
} 

$magic = new MagicMethod;  
$magic->notExist([2, 3, 54]); 

现在它显示了我的错误信息:

注意:数组字符串转换在

为什么__call方法获得阵列数据?

+0

因为你给它一个数组? (** [2,3,54] ** =>这是一个数组)。之后,您尝试'echo'数组,然后导致“数组到字符串转换...” – Xatenev

+0

因为您传递的是单个参数,这恰好是一个数组;所以在__call()里面,它是'$ values [0]'....使用'echo'implode(',',$ values [0]);'''__call()'方法 –

+0

php'implode()函数需要它的第二个参数的'array'数据,我做到了! –

回答

3

__call()的第二个参数是传递给该方法的所有参数的数组。

PHP docs

$ name参数是被调用的方法的名称。 $ arguments参数是一个包含传递给$ name'ed方法的参数的枚举数组。

在你的情况$values是:

[ 
    [2, 3, 54] 
] 

什么,你正在做的是这个数组,这会导致阵列字符串转换错误,因为[2, 3, 54]不能转换为字符串上调用implode()

0

__call方法中的$ values是在notExist方法中传递的参数数组。

所以在notExist方法中传递的数组将被$ values [0]访问。

请参阅以下代码。

class MagicMethod { 

    public function __call ($pm, $values) { 
     echo "there is not <b>$pm</b> method <br/> and arguments are <br/>"; 
     echo implode(',', $values[0]); 
    } 
} 

$magic = new MagicMethod;  
$magic->notExist([2, 3, 54]);