【问题标题】:PHP - defined constant returns undefinedPHP - 定义的常量返回未定义
【发布时间】:2015-10-06 22:31:15
【问题描述】:

我正在开发一个 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 错误:未设置表名”并退出。


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 未定义?

感谢您的帮助。

【问题讨论】:

  • “类常量”是 的一部分,而不是实例的一部分:Instances_model::DB_TABLE - PHP docs
  • 或者你可以使用SELF::,但不能使用$this->
  • 如果在基类中使用 self:: 将返回“抽象”,因此 static::DB_TABLEInstances_model::DB_TABLE 都会更好。你也可以做类似$c = get_called_class(); $c::DB_TABLE

标签: php codeigniter constants defined


【解决方案1】:

问题是您使用$this 访问一个类常量,它不是一个实例常量。你想要:

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

还有:

var_dump(self::DB_TABLE);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多