警告:传递给函数的参数不正确

时间:2015-03-12 14:30:15

标签: php cakephp warnings cakephp-3.0

我的beforeMarshal ()函数位于ModelTable.php。此函数在保存请求数据之前正确执行,但每次保存数据时都会收到php警告。

public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
{
    $ip = $data['ip'];
    $data['iplong'] = ip2long($ip);
}
  

警告(4096):传递给App \ Model \ Table \ ServersTable :: beforeMarshal()的参数1必须是App \ Model \ Table \ Event的实例,Cake \ Event \ Event实例

     

警告(4096):传递给App \ Model \ Table \ ServersTable :: beforeMarshal()的参数2必须是App \ Model \ Table \ ArrayObject的实例,给定的ArrayObject实例

     

警告(4096):传递给App \ Model \ Table \ ServersTable :: beforeMarshal()的参数3必须是App \ Model \ Table \ ArrayObject的实例,给定的ArrayObject实例

如果我将debug设置为false,一切都很好,但这不是一个很好的解决方案。

2 个答案:

答案 0 :(得分:9)

这可能是一个namespace问题。错误是该函数需要一个精确类型的对象,它接收另一个。

我假设beforeMarshal()是您自己的自定义函数,它位于命名空间App\Model\Table中(因为它属于ModelTable类)。

此外,您可能正在从未指定命名空间的其他文件中调用它,因此它会将自身视为全局命名空间。

或者

  • 在函数定义中键入提示正确的对象类型
  • 全球use ModelTable.php
  • 中的正确对象类型

精确类型提示

将您的功能定义更改为:

public function beforeMarshal(\Cake\Event\Event $event, \ArrayObject $data, \ArrayObject $options)

注意反斜杠。它们在考虑对象类型时指示函数从全局命名空间开始。

全球use

ModelTable.php脚本(或包含该功能的脚本)的最顶部添加:

use
    Cake\Event\Event,
    ArrayObject;

因此,在整个脚本中,EventArrayObject类型的任何使用都将使用正确的类型,而不是每次都指定整个名称。

选择哪一个

意见如下

我更喜欢在脚本的顶部使用use。它可以防止在此特定脚本中出现任何类型的滥用行为,当我必须将ALL\Templating\Parser更改为ALL\Parser时,我只需要在一个地方执行此操作。

每次都指定整个对象命名空间路径是麻烦的,而且更容易出错,但可能有优势;自从我开始使用它以来,我没有经历过它们并且没有停止全局方法。

答案 1 :(得分:-1)

只需删除Event,ArrayObject关键字,然后按以下方式编写:

public function beforeMarshal($event, $data, $options)
{
    $ip = $data['ip'];
    $data['iplong'] = ip2long($ip);
}

我希望这可以解决你的问题。