PHP - 定义的常量返回undefined

时间:2015-10-06 22:31:15

标签: php codeigniter constants defined

我正在开发一个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未定义?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

问题在于您使用$this来访问类常量,该常量不是实例常量。你想要:

if (!defined('self::DB_TABLE')) exit($this->table_not_set_error);

var_dump(self::DB_TABLE);

如果您希望子类能够将常量重新定义为自己的值,也可以使用static::而不是self::。您可以使用$this->来访问属于实例对象的内容,但self::static::可以访问属于类本身的内容,例如常数或静态方法或属性。