Intereting Posts
Удаление строки таблицы mySQL с помощью jQuery Ajax В чем смысл интерфейсов в PHP? API Google – разрешить соединения только с доменом Google Apps Невозможно добавить пространство имен с помощью PHP SimpleXML Go Daddy и magic_quotes_gpc twig template engine, используя статическую функцию или переменную regex – совпадение не в теге mysql_fetch_assoc (): предоставленный аргумент не является допустимым ресурсом результата MySQL в php Как полностью интегрировать XMPP на веб-сайт с зарегистрированными пользователями createUrl Yii – следует ли нам называть его на контроллере или не имеет значения? Обнаружение выхода браузера в PHP Предупреждение: недопустимый параметр смещения строки в файле php Laravel, получите последний идентификатор вставки, используя Eloquent Что лучше в цикле foreach … с использованием символа & или переназначения на основе ключа? Вызов метода непосредственно после нового?

Ошибка синтаксиса при определении массива как свойства класса

... 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 должна быть постоянной.

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

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

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

В этом отношении полезен ответ глупых на аналогичный вопрос. Хотя он использует тот же подход, что и Майкл Крелин , он показывает способ включения логики инициализации в определение класса.

Это ограничение больше не существует с 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 

Public – это объявление, которое используется только в объектах. Это не объект, удалить общественность, и все в порядке.