CakePHP延迟加载失败,无法静态访问类常量

CakePHP延迟加载失败,无法静态访问类常量,cakephp,static,lazy-loading,Cakephp,Static,Lazy Loading,在CakePHP2.2应用程序中,我在模型中使用类常量进行一些内部配置。出现了以下问题 简短版本: Cake的惰性类加载不会由对模型类的静态调用触发 如果第一次访问控制器中的模型是 MyModel::SOME_CONST // fails 该类将是未知的。如果以前使用过该类的任何实例,则可以: $this->MyModel->something(); MyModel::SOME_CONST // works 不知道延迟加载实现的详细信息: 问题:这是不可能解决的问题吗?若然,原因

在CakePHP2.2应用程序中,我在模型中使用类常量进行一些内部配置。出现了以下问题

简短版本: Cake的惰性类加载不会由对模型类的静态调用触发

如果第一次访问控制器中的模型是

MyModel::SOME_CONST // fails
该类将是未知的。如果以前使用过该类的任何实例,则可以:

$this->MyModel->something();
MyModel::SOME_CONST // works
不知道延迟加载实现的详细信息:

问题:这是不可能解决的问题吗?若然,原因为何?那么,我如何在我的应用程序中最好地解决这个问题(在函数中包装常量)?还是有机会改进延迟加载,使其也能与静态访问一起工作

带代码的长版本: 为了测试不同的情况,我制作了一个带有1个模型和1个控制器的小测试应用程序:

Model/Post.php:
<?php
class Post extends AppModel {
    public $useTable = false; // Don't bother with a DB

    const FOO = "foo";

    public $bar = "bar";
}

lazyloading在正常类调用和静态调用的情况下都能正常工作,如果您正确地使用它的话

正确的意思是,您必须始终将App::uses()所有使用过的类放在文件的顶部

对于模型文件中的AppModel:

App::uses('AppModel', 'Model');

class Post extends AppModel {}

有关详细信息,请参阅核心文件。

Nice。我只是依靠控制器自动加载它的模型。但是显式的
App::uses()
没有问题。谢谢这对我不起作用。我不得不将App::uses('Post','Model')添加到控制器的顶部。现在还不完全清楚为什么访问类常量需要这两个参数中的任何一个。如果您以非框架动态方式(而不是通过ClassRegistry、loadModel等)使用Post模型,则需要手动断言您的模型可用-因此,App::uses('Post','model')语句。非框架动态是表示CakePHP破坏本机OOP的一种好方法。如果你意识到这一点,你会省去很多问为什么的麻烦。@jasonmccreay你完全误解了这句话的意思。框架动力学和OOP不一定相互关联。
App::uses('AppModel', 'Model');

class Post extends AppModel {}