Могу ли я использовать конкатенацию строк для определения класса CONST в PHP? - PullRequest
48 голосов
/ 07 мая 2010

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

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?

Ответы [ 6 ]

34 голосов
/ 07 мая 2010

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

define('foobar', 'foo' . 'bar');

class Foo
{
    const blah = foobar;
}

echo Foo::blah;

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

21 голосов
/ 18 апреля 2016

Имхо, этот вопрос заслуживает ответа для 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

14 голосов
/ 07 мая 2010

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

Относительно констант :

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

Итак ... "нет" будет ответом: D

2 голосов
/ 07 мая 2010

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

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

1 голос
/ 06 июня 2013

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

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

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

0 голосов
/ 07 мая 2010

нет.

(я так не думаю)

...