【问题标题】:Class "X" not found in CakePHP 2.1 since php 5.4自 php 5.4 以来,在 CakePHP 2.1 中找不到类“X”
【发布时间】:2012-09-04 16:39:26
【问题描述】:

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

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

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

等等

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

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

function beforeSave($Model) {}

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

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    迁移到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
    

    移除“Call-time pass by reference”

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

    function beforeSave(&$Model)
    

    这会引发错误并且是错误的。 只需删除变量前的 & 符号。您不会破坏任何功能,因为对象已经在 PHP 中通过引用传递,据我所知,this was removed in 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() 加载了所有依赖的类。

    【讨论】:

    • 你忘记了最重要的事情:总是 app::uses() 你在这个类中使用的所有类(在文件的顶部)。这应该可以解决所描述的大部分问题。
    • 这也是我的第一个线索,但是 Class DEBUGGER 和 STRING 应该是核心类并且默认加载。此外,我已经安装了所有这些加载器,并且它在 5.4 下工作,所以我确信这个特殊问题与加载的类无关。但由于这篇文章更多地是关于良好的编码实践,我将把它添加到答案中。谢谢!
    • 永远不要假设核心类是默认加载的。如果到目前为止不使用它们,它们将不会是。行。很高兴听到这个消息:)
    • 哦,如果你是懒惰的,你会在我的升级 shell 中找到以上所有的更改和更多:github.com/dereuromark/upgrade - 单击一下,你应该将它们全部自动转换。
    • 您对核心课程的看法是正确的。问题是我什至没有在上述代码中使用 DEBUGGER 和 STRING 类,这使得这些错误更加毫无意义。
    【解决方案2】:

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

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

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

    【讨论】:

    • 隐藏错误消息是否可以替代致命错误?
    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多