... 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? Или я слепой.
Вы не можете использовать непостоянные значения при инициализации свойств класса в версиях PHP раньше 5.6.
Они инициализируются во время компиляции, при которой PHP не будет выполнять никаких вычислений или выполнять какой-либо код. (5 * (1024 * 1024))
– это выражение, которое требует оценки, которую вы не можете сделать. Либо замените это значение постоянным значением 5242880
либо выполните расчет в __construct
.
PHP 5.6, введенный в 2014 году, позволяет «постоянные скалярные выражения», в которых свойство скалярной константы или класса может быть инициализировано оцененным выражением в определении класса, а не конструктором.
Я подозреваю, что это не весь код, и это определение статической переменной внутри класса, где вы довольно ограничены в выражениях и не можете рассчитать много.
Если я прав, вы можете сделать что-то подобное:
class thingamajig { public static $aSettings; }; thingamajig::$aSettings = array ( ... );
PS Извините, я только что прочитал вашу прозу, где вы подтверждаете, что это часть статической переменной класса. Поэтому вы не можете просто игнорировать ключевое слово вне места.
Я предполагаю, что вы показываете на самом деле свойство класса (из-за открытого ключевого слова). Инициализация свойств класса в PHP должна быть постоянной.
Это объявление может включать инициализацию, но эта инициализация должна быть постоянным значением, то есть она должна быть способна быть оценена во время компиляции и не должна зависеть от информации о времени выполнения для оценки.
Когда вы определяете переменную в классе, вы не можете назначать ей выражение. (5 * (1024 * 1024))
является выражением. 6164480
нет.
В этом отношении полезен ответ глупых на аналогичный вопрос. Хотя он использует тот же подход, что и Майкл Крелин , он показывает способ включения логики инициализации в определение класса.
Новая функция, которая разрешает ранее запрещенный синтаксис, называется постоянными скалярными выражениями :
Теперь можно предоставить скалярное выражение, включающее числовые и строковые литералы и / или константы в контекстах, в которых 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
Public – это объявление, которое используется только в объектах. Это не объект, удалить общественность, и все в порядке.