usdglander
@usdglander
Yipee-ki-yay

Возможно ли использование констант в константах?

Добрый день.
Решил я тут в одном небольшом проекте без PDO и ORM вынести все запросы в отдельный класс. Чтобы увеличить гибкость хочу сделать так:
<?php

class Query
{
	const TABLE_PREFIX = 'prefix_';	
	
	const TABLE_ENTITYES = 'entity';

	//?i - плейсхолдер для обёртки над mysqli
	const GET_ENTITY_BY_ID = '
		SELECT
			`id` AS id,
			`name` AS name,
			`origin` AS domain,
			`token` AS token
		FROM 
			' . self::TABLE_PREFIX . self::TABLE_ENTITYES . '
		WHERE
			`id`=?i
		LIMIT 1';
}
 
$queryString = Query::GET_ENTITY_BY_ID; //обращение к запросу

Но PHP, оказывается, не допускает использование констант в константах. Есть ли вариант как то заставить это работать или всё таки придётся возиться с геттерами и вводить какую то шаблонизацию? Не хочется отдельный экземпляр класса создавать, а хочется получать всё по статике.
Я сильно многого хочу, да? :)
Заранее спасибо :)
  • Вопрос задан
  • 272 просмотра
Пригласить эксперта
Ответы на вопрос 2
index0h
@index0h
PHP, Golang. https://github.com/index0h
В 5.6 - можно, бывают кейсы для этого, например группы констант в массивах. Но ваша SQL-ина в константах - это:

Y8lv5GmpfQA.jpg

Либо делайте статическую переменную непосредственно внутри метода (что тоже не хорошо на самом деле), либо только метод, который вернет вашу SQL-лину.
Ответ написан
Комментировать
27cm
@27cm
TODO: Написать статус
В PHP 5.6 константные выражения должны работать:
php.net/manual/ru/migration56.new-features.php

Но если очень уж хочется на старой версии, то можно сделать такой трюк:
<?php

define('QUERY_TABLE_PREFIX', 'prefix_');
define('QUERY_TABLE_ENTITYES', 'entity');
define('QUERY_GET_ENTITY_BY_ID', 
    'SELECT `id` AS id, `name` AS name, `origin` AS domain, `token` AS token ' . 
    'FROM ' . QUERY_TABLE_PREFIX . QUERY_TABLE_ENTITYES . ' ' .
    'WHERE `id`=?i LIMIT 1'
);

class Query
{
  const TABLE_PREFIX = QUERY_TABLE_PREFIX;	
  
  const TABLE_ENTITYES = QUERY_TABLE_ENTITYES;

  const GET_ENTITY_BY_ID = QUERY_GET_ENTITY_BY_ID;
}
 
$queryString = Query::GET_ENTITY_BY_ID;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽