我已经将我的机器从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
));
请注意,这不是一个理想的解决方案,请修复您的代码!