Я работаю над проектом 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();
Два var_dumps в функции get_by () возвращают false и «instance», соответственно. Это не имеет смысла. Если 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::
чтобы получить доступ к вещам, которые принадлежат самому классу, таким как константа или статический метод или свойство.
Других решений пока нет …