我有一个位于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;
这样在整个脚本中,任何对Event
和ArrayObject
类型的使用都将使用正确的类型,而无需每次都指定整个名称。
选择哪一个
意见如下
我更喜欢在脚本的顶部使用use
。它可以防止在此特定脚本中滥用任何类型的类型,并且当我必须将ALL'Templating'Parser
更改为ALL'Parser
时,我只需要在一个地方执行此操作。
每次指定整个对象命名空间路径都很麻烦,而且更容易出错,但可能有优点;自从我开始使用全局方法以来,我没有经历过它们,也没有停止过它。
只需删除 Event、ArrayObject 关键字,然后按以下方式编写:
public function beforeMarshal($event, $data, $options)
{
$ip = $data['ip'];
$data['iplong'] = ip2long($ip);
}
我希望这能解决你的问题。