Синтаксическая ошибка при определении массива как свойства класса - PullRequest
5 голосов
/ 10 февраля 2012
...

public $aSettings = array(
  'BindHost' => "127.0.0.1",
  'Port' => 9123,
  'MaxFileSize' => (5 * (1024 * 1024)), // unexpected "(" here
  'UploadedURL' => "http://localhost",
  'UploadPath' => dirname(__FILE__) . "/upload",
  'UploadMap' => dirname(__FILE__) . "/uploads.object",
  'RegisterMode' => false
);

...

Это мой код, прямо из класса. У меня проблема с "unexpected ( on line 22", строка 22 - MaxFileSize.

Я не вижу проблемы с этим, это ограничение Zend Engine? Или я слепой.

Ответы [ 6 ]

8 голосов
/ 10 февраля 2012

Вы не можете использовать непостоянные значения при инициализации свойств класса в версиях PHP более ранних, чем 5.6.
Они инициализируются во время компиляции, когда PHP не будет выполнять вычисления или выполнять какой-либо код.(5 * (1024 * 1024)) - это выражение, которое требует оценки, чего вы не можете сделать там.Либо замените его на постоянное значение 5242880, либо выполните вычисления в __construct.

PHP 5.6, введенном в 2014 году, допускает "константу скалярных выражений" , в которой скалярная константа или класссвойство может быть инициализировано оцененным выражением в определении класса, а не конструктором.

3 голосов
/ 10 февраля 2012

Я предполагаю, что то, что вы показываете, на самом деле является свойством класса (из-за открытого ключевого слова).Инициализация свойств класса в PHP должна быть постоянной.

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

http://www.php.net/manual/en/language.oop5.properties.php

3 голосов
/ 10 февраля 2012

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

Если яправильно, вы можете сделать что-то подобное вместо этого:

class thingamajig {
    public static $aSettings;
};
thingamajig::$aSettings = array ( ... );

PS Извините, я только что прочитал вашу прозу, где вы подтверждаете, что она является частью статической переменной класса.Так что вы не можете просто игнорировать неуместное ключевое слово.

1 голос
/ 10 февраля 2012

Когда вы определяете переменную в классе, вы не можете присвоить ей выражение. (5 * (1024 * 1024)) это выражение. 6164480 нет.

0 голосов
/ 13 марта 2014

Это ограничение больше не существует с PHP 5.6

Новая функция, которая включает ранее запрещенный синтаксис, называется константа скалярных выражений :

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

class C {
    const THREE = TWO + 1;
    const ONE_THIRD = ONE / self::THREE;
    const SENTENCE = 'The value of THREE is '.self::THREE;

    public function f($a = ONE + self::THREE) {
        return $a;
    }
}

echo (new C)->f()."\n"; echo C::SENTENCE; ?>

Приведенный выше пример выведет:

4 The value of THREE is 3
0 голосов
/ 10 февраля 2012

Public - это объявление, используемое только в объектах. Это не объект, удали публичный и все нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...