我正在开发一个CodeIgniter项目,但我遇到了一些常量问题。
我的实例模型 - 扩展了通用的MY_Model - 定义了其对应的SQL表的常量,'实例'。
const DB_TABLE = 'instances';
在其他地方,调用$ instances_model-> get_by(),它存在于MY_Model中,它引用该常量,在Instances_model的上下文中应该覆盖MY_Model中同名的常量。 get_by()以:
开头if(!defined('$this::DB_TABLE')) exit($this->table_not_set_error);
应用程序返回“Instances_model错误:表名未设置”并退出。
MY_Model的声明/构造函数:
class MY_Model extends CI_Model {
const DB_TABLE = 'abstract';
public $table_not_set_error;
function __construct() {
parent::__construct();
$this->table_not_set_error = get_class($this) . " error: table name is not set.";
}
get_by:
public function get_by($attribute, $value = null, $include_obsolete=0)
{
var_dump(defined('$this::DB_TABLE'));
var_dump($this::DB_TABLE);
if(!defined('$this::DB_TABLE')) exit($this->table_not_set_error);
Instances_model:
class Instances_model extends MY_Model
{
const DB_TABLE = 'instances';
public function __construct()
{
parent::__construct();
get_by()函数中的两个var_dump分别返回false和“instances”。这没有意义。如果PHP可以返回常量的值,那怎么能不定义?它甚至返回正确的上下文:“实例”而不是“抽象”。为什么PHP认为$ this :: DB_TABLE未定义?
感谢您的帮助。
答案 0 :(得分:1)
问题在于您使用$this
来访问类常量,该常量不是实例常量。你想要:
if (!defined('self::DB_TABLE')) exit($this->table_not_set_error);
和
var_dump(self::DB_TABLE);
如果您希望子类能够将常量重新定义为自己的值,也可以使用static::
而不是self::
。您可以使用$this->
来访问属于实例对象的内容,但self::
或static::
可以访问属于类本身的内容,例如常数或静态方法或属性。