类“;X〃;自php 5.4以来,在CakePHP 2.1中找不到


Class "X" not found in CakePHP 2.1 since php 5.4

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

致命错误:在中找不到类"String"/Behavior.php在线。。。

致命错误:在中找不到类"调试器"/Component.php联机。。。

等等。

这些错误实际上没有什么用处,因为错误的LINE和FILE总是声明类声明的尾括号。

经过大量搜索,我通过添加适当的公共/私有函数声明和强参数类型(a.K.a.:)解决了一些错误

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

在转移到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

删除"通过引用调用时间"

我见过很多人在函数中绕过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()加载了所有依赖的类。

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

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

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