嘻嘻哈a 2017-06-30 06:00 采纳率: 100%
浏览 999
已采纳

PHP中 __call去调用一个成员函数出问题

如此,代码如下
<?php
header("Content-type:text/html;charset=utf-8");
//call

class Monkey{
public $name;
protected $food;

public function __construct($name,$food){
    $this->name = $name;
    $this->food = $food;    
}

public function __call($method,$args){
    return $this->$args[0]($args[1], $args[2]);     
}

//成员函数
public function getSum($n1, $n2){
    return $n1 + $n2;
}

}

$monkey = new Monkey('妖猴','兔子');
$res = $monkey->play('getSum',200,400);
echo $res;
?>

执行后出现

Notice: Array to string conversion in D:\phptools\Apache24\htdocs\oop\call1.php on line 15

Notice: Undefined property: Monkey::$Array in D:\phptools\Apache24\htdocs\oop\call1.php on line 15

Fatal error: Uncaught Error: Function name must be a string in D:\phptools\Apache24\htdocs\oop\call1.php:15 Stack trace: #0 D:\phptools\Apache24\htdocs\oop\call1.php(25): Monkey->__call('play', Array) #1 {main} thrown in D:\phptools\Apache24\htdocs\oop\call1.php on line 15

此处,$args已是一个数组($args[0]=getSum, $args[1]=200,$args[2]=400)
1,为什么出现 Undefined property: Monkey::$Array?
2, $this->$args0;这样调用成员函数为什么会不成功呢?
程序应该是这样执行后求出和才对啊,$this->getSum(200,400);

  • 写回答

4条回答 默认 最新

  • cRazy谢不清 2017-07-10 06:35
    关注

    你的php是什么版本的? 你的写法理应是可以的,php是弱类型语言 你的 Array[0],它可能不认为一定就是字符串类型;避免这样的bug建议可以这样写:
    public function __call($method,$args){
    $methodName = (string)$args[0] ;
    if(empty($methodName))
    {
    return false;
    }else{
    return $this->$methodName($args[1], $args[2]);
    }
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?