3

我已将我的机器从 PHP 5.3 更新到 PHP 5.4,而我的 CakePHP(2.1.1 版)应用程序不断收到以下错误:

致命错误:在线.../Behavior.php 中找不到类“字符串”...

致命错误:在线.../Component.php 中找不到类“调试器”...

等等。

这些错误真的没有用,因为错误的 LINE 和 FILE 总是声明类声明的结束括号。

经过大量搜索,我设法通过添加适当的公共/私有函数声明和强参数类型来解决一些错误,AKA:

function beforeSave($Model) {}

//becomes
public function beforeSave(Model $Model){}
4

2 回答 2

8

迁移到 PHP5.4 后,你必须清理代码中的很多“坏习惯”。

扩展方法中的强类型参数定义

这意味着您必须在变量名之前编写该方法接收的对象的类。这只需要替换父类方法的方法,而不是所有方法。如果不确定,只需检查核心文件或 API 中父类中的方法声明即可。

// Behavior code
public function afterSave(Model $model, $created) //GOOD 
function aferSave($model) //NOT GOOD
// Component code
public function shutdown(Controller $Controller) // GOOD
function shutdown($Controller) // BAD

删除“调用时通过引用传递”

我已经看到很多人通过引用在函数中传递 arround Controller 和 Model 对象:

function beforeSave(&$Model)

这会引发错误并且是错误的。只需删除变量前的 & 符号。您不会破坏任何功能,因为对象已经在 PHP 中通过引用传递,并且据我所知,这已在 PHP 5.4 中删除

在扩展方法中声明所有方法参数

如果覆盖父类的方法,则应在函数定义中声明所有函数参数。如果缺少参数,您将收到错误消息。

例子:

SomeBehavior extends ModelBehavior
public function afterSave(Model $Model){ } //WRONG, but works in 5.3
public function afterSave(Model $Model, $created){ } //RIGHT, works everwhere :)

添加 App::load() 以加载依赖项

检查您的类是否真的可用总是好的,因此请仔细检查您是否在文件开头使用App::load()加载了所有依赖的类。

于 2012-09-04T16:39:26.763 回答
4

另一种解决方案是将 Core.php 中的错误报告级别更改为:

Configure::write('Error', array(
    'handler' => 'ErrorHandler::handleError',
    'level' => E_ALL & ~E_DEPRECATED & ~E_STRICT,
    'trace' => true
));

请注意,这不是一个理想的解决方案,请修复您的代码!

于 2012-11-07T10:15:18.283 回答