Можно ли использовать конкатенацию строк для определения класса 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?
Ответы
Ответ 1
Imho, этот вопрос заслуживает ответа на PHP 5.6 +, благодаря @jammin comment
С 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
Ответ 2
Единственный способ определить() выражение, а затем использовать эту константу в классе
define('foobar', 'foo' . 'bar');
class Foo
{
const blah = foobar;
}
echo Foo::blah;
Другой вариант - перейти на bugs.php.net и попросить их исправить это.
Ответ 3
Всегда возвращайтесь к надежному руководству для таких вещей.
Относительно constants:
Значение должно быть константой выражение, а не (например) a переменная, свойство, результат математическая операция или функция звоните.
Итак... "нет" будет ответом: D
Ответ 4
Для констант класса вы не можете назначать ничего, кроме постоянного выражения. Цитирование руководство по PHP:
"Значение должно быть константным выражением, а не (например) переменной, свойством, результатом математической операции или вызовом функции."
Ответ 5
Это может быть не то, что вы ищете, но я наткнулся на этот поток, так что вот решение, которое я использовал для проблемы, с которой я столкнулся (исходя из ответа @user187291):
define('app_path', __DIR__ . '/../../');
const APPLICATION_PATH = app_path;
.
.
.
require_once(APPLICATION_PATH . "some_directory/some_file.php");
.
.
.
Кажется, отлично работает!
Ответ 6
нет.
(я не думаю, что есть)