我试图在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)语句导致它,我试图调试它并得到相同的错误。 任何帮助或想法朝着正确的方向解决这个问题表示赞赏。
答案 0 :(得分:0)
我认为你不能在PHP中定义这样的$ status。问题是您无法使用函数的结果定义类属性。
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'
}
}
这样你可以在任何地方重复使用这些常量;在助手,模型,控制器。你可以“组合”这些常数:)