0

我试图在我的 AppModel 中定义一些状态常量,以便在每个模型中都可用。为了获取它们的字符串值,我想将它们存储在一个数组中,但是当我尝试将字符串国际化时,它会导致以下错误:

致命错误:在第 181 行的 /home/dev/www/test/lib/Cake/Utility/ClassRegistry.php 中调用未定义函数 AppModel()

我的代码:

class AppModel extends Model {
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
    public $statuses = array(
        self::STATUS_INACTIVE => __('Inactive'),
        self::STATUS_ACTIVE => __('Active')
    );
}

我查看了核心,发现以下行引发了错误:

$instance = new $appModel($settings);

$appModel($settings) 语句导致它,我试图调试它并得到同样的错误。任何帮助或想法朝着正确的方向解决这个问题表示赞赏。

4

1 回答 1

0

我不认为你可以在 PHP 中定义 $statuses 那样的东西。问题是您不能使用函数的结果来定义类属性。

http://www.php.net/manual/en/language.oop5.properties.php

类成员变量称为“属性”。您可能还会看到使用“属性”或“字段”等其他术语来提及它们,但出于本参考的目的,我们将使用“属性”。它们是通过使用关键字 public、protected 或 private 之一定义的,后跟一个普通的变量声明。这个声明可能包括一个初始化,但是这个初始化必须是一个常量值——也就是说,它必须能够在编译时被评估,并且不能依赖于运行时信息才能被评估。

如果你想用翻译的标签设置属性,把它移到你的构造函数中,这意味着初始化对象;

class AppModel extends Model {
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
    public $statuses;

    public function __construct($id = false, $table = null, $ds = null) {
        parent::__construct($id, $table, $ds);
        $this->statuses = array(
            self::STATUS_INACTIVE => __('Inactive'),
            self::STATUS_ACTIVE => __('Active')
        );
    }
}

或者将其移至另一个方法,以便仅在实际使用时生成,就像这样;

public function getStatusOptions()
{
   return array(
        self::STATUS_INACTIVE => __('Inactive'),
        self::STATUS_ACTIVE => __('Active')
   );
}

另一个注意事项; 定义类常量并使其可重用而不将它们添加到 AppModel 的一个好技巧是使用接口;

interface ActiveInactive {
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
}


interface FooBar {
     const HELLO = 'world';
}


class MyModel extends AppModel implements ActiveInactive, FooBar {

    public function test()
    {
        echo self::STATUS_INACTIVE;  // outputs '1'
        echo self::HELLO;            // outputs 'world'
    }

}

 class MyHelper extends Helper implements ActiveInactive, FooBar {

    public function test()
    {
        echo self::STATUS_INACTIVE;  // outputs '1'
        echo self::HELLO;            // outputs 'world'
    }

}

这样你就可以在任何地方重复使用这些常量;在助手、模型、控制器中。你可以“组合”这些常数:)

于 2013-03-07T22:03:39.793 回答