Можно ли использовать конкатенацию строк для определения класса CONST в PHP?

Я знаю, что вы можете создавать глобальные константы в терминах друг друга с помощью конкатенации строк:

define('FOO', 'foo'); define('BAR', FOO.'bar'); echo BAR; 

напечатает «foobar».

Тем не менее, я получаю сообщение об ошибке, пытающееся сделать то же самое с использованием констант класса.

 class foobar { const foo = 'foo'; const foo2 = self::foo; const bar = self::foo.'bar'; } 

foo2 определяется без проблем, но объявление const bar приведет к ошибке

Ошибка анализа: синтаксическая ошибка, неожиданные '.', Ожидающие ',' или ';'

Я также пытался использовать такие функции, как sprintf (), но он не похож на левый парн больше, чем на конкатенатор строки.

Так есть ли способ создания констант класса в терминах друг друга в чем-то более чем тривиальном случае набора, таком как foo2?

Solutions Collecting From Web of "Можно ли использовать конкатенацию строк для определения класса CONST в PHP?"

Imho, этот вопрос заслуживает ответа на PHP 5.6+ , благодаря комментарию @jammin

Начиная с PHP 5.6 вам разрешено определять статические скалярные выражения для константы:

 class Foo { const BAR = "baz"; const HAZ = self::BAR . " boo\n"; } 

Хотя это не является частью вопроса, нужно знать пределы реализации. Следующие действия не будут работать, хотя это статический контент (но можно управлять во время выполнения):

 class Foo { public static $bar = "baz"; const HAZ = self::$bar . " boo\n"; } // PHP Parse error: syntax error, unexpected '$bar' (T_VARIABLE), expecting identifier (T_STRING) or class (T_CLASS) class Foo { public static function bar () { return "baz";} const HAZ = self::bar() . " boo\n"; } // PHP Parse error: syntax error, unexpected '(', expecting ',' or ';' 

Для получения дополнительной информации см. https://wiki.php.net/rfc/const_scalar_exprs и http://php.net/manual/en/language.oop5.constants.php

Единственный способ – определить () выражение, а затем использовать эту константу в классе

 define('foobar', 'foo' . 'bar'); class Foo { const blah = foobar; } echo Foo::blah; 

Другой вариант – перейти на bugs.php.net и попросить их исправить это.

Всегда возвращайтесь к надежному руководству для таких вещей.

Что касается констант :

Значение должно быть константным выражением, а не (например) переменной, свойством, результатом математической операции или вызовом функции.

Итак … «нет» будет ответом: D

Для констант класса вы не можете назначать ничего, кроме постоянного выражения. Цитирование руководства PHP :

«Значение должно быть постоянным выражением, а не (например) переменной, свойством, результатом математической операции или вызовом функции».

Это может быть не то, что вы ищете, но я столкнулся с этим потоком, так что вот решение, которое я использовал для проблемы, с которой я столкнулся (исходя из ответа @ user187291):

 define('app_path', __DIR__ . '/../../'); const APPLICATION_PATH = app_path; . . . require_once(APPLICATION_PATH . "some_directory/some_file.php"); . . . 

Кажется, отлично работает!

нет.

(Я не думаю, что есть)