我正在做一个CodeIgniter项目,我一直在常量方面遇到一些麻烦。
我的实例模型——扩展了一个通用的MY_Model——定义了它对应的SQL表的一个常量,'instances'。
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 error: table name is not set"并退出。
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是未定义的?
谢谢你的帮助。
问题是您正在使用$this
访问一个类常量,这不是一个实例常量。你想要的:
if (!defined('self::DB_TABLE')) exit($this->table_not_set_error);
:
var_dump(self::DB_TABLE);
你也可以使用static::
而不是self::
,如果你想一个子类能够重新定义常量为自己的值。您使用$this->
访问属于类的实例对象的东西,但self::
或static::
访问属于类本身的东西,如常量或静态方法或属性。