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


warning: incorrect argument passed to function

我有一个位于ModelTable.php的函数beforeMarshal ()。 此函数在保存请求数据之前正确执行,但是每次保存数据时我都会收到 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 实例

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

这可能是命名空间问题。错误在于该函数想要一个精确类型的对象,但它接收另一个对象。

我假设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时,我只需要在一个地方执行此操作。

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

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

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

我希望这能解决你的问题。