【发布时间】: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_TABLE或Instances_model::DB_TABLE都会更好。你也可以做类似$c = get_called_class(); $c::DB_TABLE
标签: php codeigniter constants defined