2010-11-28 2 views
8

Вот код, который не будет работать:Как использовать константу класса в атрибуте класса в PHP?

class MyClass 
{ 
    const myconst = 'somevalue'; 

    private $myvar = array(0 => 'do something with '.self::myconst); 
} 

Кажется, что константы класса не доступны в «время компиляции», но только во время выполнения. Кто-нибудь знает обходное решение? (Определить не будет работать)

Благодарности

+0

Если вы ищете что-то вроде макроса C, PHP не работает таким образом. кроме того, нет «времени компиляции». PHP является интерпретатором. – stillstanding 2010-11-28 14:37:09

+0

Люди, написавшие руководство, похоже, находятся под впечатлением, что существует «время компиляции». http://www.php.net/manual/en/language.oop5.properties.php – 2010-11-28 14:50:54

ответ

10

Проблема в вашем объявлении класса не то, что вы используете постоянный, но что вы используете выражение.

Переменные элемента класса называются «свойствами». (...) Они определяются с использованием одного из ключевых слов public, protected или private, за которым следует объявление нормальной переменной. Это объявление может включать инициализацию, , но эта инициализация должна быть постоянным значением - то есть она должна быть способна быть оценена во время компиляции и не должна зависеть от информации о времени выполнения для оценки.

Этой простая декларация, к примеру, не будет компилировать (ошибка синтаксического анализа):

class MyClass{ 
    private $myvar = 3+2; 
} 

Но если мы изменим ваше объявление класса использовать простую константу, а не строки, сцепленные с этим константой она будет работайте, как ожидалось.

class MyClass{ 
    const myconst = 'somevalue'; 
    public $myvar = array(0 => self::myconst); 
} 

$obj = new MyClass(); 
echo $obj->myvar[0]; 

В обходным можно инициализировать свои свойства в конструкторе:

class MyClass{ 
    const myconst = 'somevalue'; 
    public $myvar; 

    public function __construct(){ 
     $this->myvar = array(0 => 'do something with '.self::myconst); 
    } 
} 
$obj = new MyClass(); 
echo $obj->myvar[0]; 

Я надеюсь, что это поможет вам,
Алинского

0

Обратите внимание, что для PHP 5.6 и выше , это можно сделать.

См https://secure.php.net/manual/en/migration56.new-features.php:

Теперь можно представить скалярное выражение, включающее числовые и строковые литералы и/или константы в контекстах, где PHP ожидалось ранее статическое значение, например, постоянные и имущественных деклараций и функции по умолчанию аргументы.

Смежные вопросы