gpt4 book ai didi

CakePHP 延迟加载因静态访问类常量而失败

转载 作者:行者123 更新时间:2023-12-02 00:11:42 26 4
gpt4 key购买 nike

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

简短版:

Cake 的延迟类加载不会由对 Model 类的静态调用触发。

如果第一次访问 Controller 中的模型是

MyModel::SOME_CONST // fails

类(class)将是未知的。如果之前使用过该类的任何实例,那也没关系:

$this->MyModel->something();
MyModel::SOME_CONST // works

不知道延迟加载实现的细节:

问题:这是无法解决的问题吗?如果是这样,为什么?那么我自己如何在我的应用程序中最好地解决它(将 consts 包装在一个函数中)?或者是否有机会改进延迟加载,使其也适用于静态访问?

带代码的长版:

为了测试不同的情况,我制作了一个包含 1 个模型和 1 个 Controller 的小型测试应用:

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

const FOO = "foo";

public $bar = "bar";
}
Controller /PostsController.php:
<?php
class PostsController extends AppController {
public function constant() {
debug(Post::FOO);
}

public function variable() {
debug($this->Post->bar);
}

public function variableFirst() {
debug($this->Post->bar);

debug(Post::FOO);
}
}

通过浏览器访问三个 Controller 操作,现在可以测试不同的情况。

1) 访问模型常量(在 /posts/constant):

Error: Class 'AppModel' not found

2) 访问模型变量(在 /posts/variable):

'bar'

3) 在变量之后访问模型常量(在 /posts/variable):

'bar'

'foo'

最佳答案

延迟加载适用于普通的类调用,如果您正确处理它,也适用于静态调用。

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

对于模型文件中的 AppModel:

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

class Post extends AppModel {}

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

关于CakePHP 延迟加载因静态访问类常量而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14957503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com