Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не работает условный оператор в объявлении полей класса PHP 5.4

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
TuX560
Отправлено: 29 Февраля, 2016 - 12:45:21
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




Добрый день, данная проблема возникла не у меня, а у моего друга, поэтому все детали данного магического поведения мне не ясны(в том числе и логи) А суть вот в чем: при объявлении поля класса и задания значения через условный оператор, фреймворк YII на php 5.4 выдает ошибку примерного вида unexpected '?'. на php 5.5 такой проблемы не наблюдается. В чем же корень данной проблемы?

PHP:
скопировать код в буфер обмена
  1. ...
  2. class A
  3. {
  4.    public $var1 = CONST ? '1' : '2';
  5. }

(Добавление)
upd. Кажется уже нашел в документации: "Переменные, которые являются членами класса, называются "свойства". Также их называют, используя другие термины, такие как "атрибуты" или "поля", но в рамках этой документации, мы будем называть их свойствами. Они определяются с помощью ключевых слов public, protected, или private, следуя правилам правильного описания переменных. Это описание может содержать инициализацию, но инициализация должна применяться для константных значений - то есть, переменные должны быть вычислены во время компиляции и не должны зависеть от информации программы во время выполнения для их вычисления."

Теперь такой вопрос: почему в 5.5 все работает?)
 
 Top
Мелкий Супермодератор
Отправлено: 29 Февраля, 2016 - 13:24:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Уверены, что 5.5, а не 5.6?
Некоторые типы вычислений разрешили в 5.6

Цитата:
melkij@melkij:~$ php-5.4.45 -f phptest.php
PHP Parse error: syntax error, unexpected '?', expecting ',' or ';' in /home/melkij/phptest.php on line 4

Parse error: syntax error, unexpected '?', expecting ',' or ';' in /home/melkij/phptest.php on line 4
melkij@melkij:~$ php-5.5.32 -f phptest.php
PHP Parse error: syntax error, unexpected '?', expecting ',' or ';' in /home/melkij/phptest.php on line 4

Parse error: syntax error, unexpected '?', expecting ',' or ';' in /home/melkij/phptest.php on line 4
melkij@melkij:~$ php-5.6.18 -f phptest.php
melkij@melkij:~$ cat phptest.php
<?php
class A
{
public $var1 = FOO ? '1' : '2';
}


-----
PostgreSQL DBA
 
 Top
TuX560
Отправлено: 29 Февраля, 2016 - 13:43:43
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




Мелкий пишет:
Уверены, что 5.5, а не 5.6?
Некоторые типы вычислений разрешили в 5.6

Что удалось выпытать из друга) Решить ему решили путем инициализации в конструкторе, для него работает и ладно, а самому интересно стало. В текущей его версии php(пока не известна) даже при полном выводе debug - никаких ошибок/предупреждений не выдает, и работает вариант с инициализацией с использованием условного оператора.

PS: Вы кажется не объявили константу FOO
К сожалению у самого под руками только 5.6 поэтому сам протестить не могу.

upd. проверил у себя на 5.6 - тоже не работает Не понял Теперь еще большая загадка, почему у него получается использовать данный синтаксис. возможно причина в xampp под windows? Сам тестил под федорой
(Добавление)
Новые забавные факты: пример тот что выше у него тоже не работает, а вот содержимое файла assets\AppAsset.php успешно отрабатывает. PHP 5.6.8
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. namespace app\assets;
  3.  
  4. use yii\web\AssetBundle;
  5.  
  6. class AppAsset extends AssetBundle
  7. {
  8.     public $basePath = '@webroot';
  9.     public $baseUrl = '@web';
  10.     public $css = [
  11.         YII_DEBUG ? 'css/site.css' : 'css/site.min.css',
  12.     ];
  13.    
  14.     public $js = [];
  15.    
  16.     public $depends = [
  17.         'yii\web\YiiAsset',
  18.         'yii\bootstrap\BootstrapAsset',
  19.     ];
  20. }

(Отредактировано автором: 29 Февраля, 2016 - 13:50:53)

 
 Top
Viper
Отправлено: 29 Февраля, 2016 - 14:31:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




TuX560 пишет:
Теперь еще большая загадка
оба пишут говнокод и не знают как этот говнокод дебажить. КО


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Мелкий Супермодератор
Отправлено: 29 Февраля, 2016 - 14:34:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




TuX560 пишет:
PS: Вы кажется не объявили константу FOO

Та нафиг она нужна. Главное, что в 5.6 это уже синтаксически корректный код.

TuX560 пишет:
пример тот что выше у него тоже не работает

Это который
PHP:
скопировать код в буфер обмена
  1. class A
  2. {
  3.    public $var1 = CONST ? '1' : '2';
  4. }

? CONST - зарезервированное слово. На него парсер и обижается. Потому у себя и вписал какую-нибудь другую константу.


-----
PostgreSQL DBA
 
 Top
TuX560
Отправлено: 29 Февраля, 2016 - 14:42:43
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




Мелкий пишет:
TuX560 пишет:
PS: Вы кажется не объявили константу FOO

Та нафиг она нужна. Главное, что в 5.6 это уже синтаксически корректный код.

TuX560 пишет:
пример тот что выше у него тоже не работает

Это который
PHP:
скопировать код в буфер обмена
  1. class A
  2. {
  3.    public $var1 = CONST ? '1' : '2';
  4. }

? CONST - зарезервированное слово. На него парсер и обижается. Потому у себя и вписал какую-нибудь другую константу.

Прошу прощения, Вы правы, вместо CONST тоже использовалось другое имя, но проблема была в синтаксисе допущенная по невнимательности.

Тогда вопрос: можно так писать если в требованиях указать php 5.6 или все-таки это говнокод?
 
 Top
DelphinPRO
Отправлено: 29 Февраля, 2016 - 16:07:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




TuX560 пишет:
Тогда вопрос: можно так писать если в требованиях указать php 5.6 или все-таки это говнокод?


Конечно говнокодъ.

Для инициализации объекта существует специальный метод-конструктор __construct()
Чем он вам не понравился?


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
TuX560
Отправлено: 01 Марта, 2016 - 08:17:14
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




DelphinPRO пишет:
Для инициализации объекта существует специальный метод-конструктор __construct()
Чем он вам не понравился?

Так и посоветовал, а что если класс статический и доступ к полю есть только через геттер?(вопрос чисто абстрактный)
 
 Top
LIME
Отправлено: 01 Марта, 2016 - 08:28:02
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




TuX560 пишет:
а что если класс статический
значит он не нужен
распространенная ошибка новичков в ООП клепать "статические" классы
TuX560 пишет:
доступ к полю есть только через геттер
сие невозможно
либо всё статика либо используются акцессоры
невозможно сделать закрытое свойство в статическом классе так как для закрытого свойства нужен инстанс
короче что надо сделать? подозреваю что ничего и вопрос чисто по теории
тогда совет просто начать писать и набить шишки
 
 Top
TuX560
Отправлено: 01 Марта, 2016 - 10:36:42
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




LIME пишет:
TuX560 пишет:
а что если класс статический
значит он не нужен
распространенная ошибка новичков в ООП клепать "статические" классы

Согласен в большинстве случаев статические классы не нужны(есть опыт c++/c#) Вопрос был чисто теоритический.
LIME пишет:
TuX560 пишет:
доступ к полю есть только через геттер
сие невозможно
либо всё статика либо используются акцессоры
невозможно сделать закрытое свойство в статическом классе так как для закрытого свойства нужен инстанс

Об этом не подумал.
LIME пишет:
короче что надо сделать? подозреваю что ничего и вопрос чисто по теории
тогда совет просто начать писать и набить шишки

Абсолютно верно, мне пока в голову такое писать не приходило, а друг столкнулся с подобной ситуацией, захотелось разобраться.

Спасибо за ответы
 
 Top
LIME
Отправлено: 01 Марта, 2016 - 10:41:33
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




TuX560 пишет:
а друг столкнулся с подобной ситуацией
скорее всего дело именно в отвлеченности от проблемы
наверное ты чтото себе сам придумал
сам создал проблему и сам ее решаешь
условия в голове
такое бывает часто когда решаешь сугубо умозрительные задачи...тоесть думаешь что прочитал и понял и только на практике понимаешь что неправильно понял теорию
хотя видимо это ты уже понял
TuX560 пишет:
Спасибо за ответы
заходи не бойся
думающему человеку всегда приятно ответить
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB