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.SU

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


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

> Без описания
deniel1987
Отправлено: 06 Августа, 2013 - 17:11:11
Post Id


Новичок


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


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




Привет всем!
Вот это работает:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $x = new stdclass;
  3. $x->{1} = 11;
  4. echo $x->{1};
  5.  
  6. ${2} = 22;
  7. echo ${2};
  8.  
  9. $x->{1.1} = 33;
  10. echo $x->{1.1};
  11.  
  12. ${2.2} = 44;
  13. echo ${2.2};
  14. ?>


Я не думал что вобще возможно использовать число в качестве имени переменной или свойства, про синтаксис с фигурными скобками я знал и раньше. Однако такие имена не соответствуют этому: http://www.php.net/manual/en/lan...ables.basics.php Прошу высказать ваше мнение по этому поводу, а ещё лучше дать ссылку на объяснение каким образом переменные могут иметь подобные имена. Спасибо!
 
 Top
EuGen Администратор
Отправлено: 06 Августа, 2013 - 17:12:53
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Не очень понятно, в чём вопрос. Работает ли это? Да, работает. Нужно ли так делать? Нет, не нужно.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
_Dark_
Отправлено: 06 Августа, 2013 - 18:30:29
Post Id


Частый гость


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


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

[+]


Ну конвертируется в строку название и в $GLOBALS заносится, а что?
 
 Top
deniel1987
Отправлено: 06 Августа, 2013 - 22:52:00
Post Id


Новичок


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


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




EuGen пишет:
Не очень понятно, в чём вопрос. Работает ли это? Да, работает. Нужно ли так делать? Нет, не нужно.
Попробую объяснить. Итак прежде всего цитата из документации
Цитата:
Variable names follow the same rules as other labels in PHP. A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores. As a regular expression, it would be expressed thus: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Из этого следует что в приведённом мной примере работают переменные с именами которые не являются "валидными" тоесть теоритически это не должно работать. И это не работает если делать так:
но работает если делать так:
Кстати в случае с получается примерно такая ошибка: Parse error: syntax error, unexpected '1'. Это наводит меня на мысль что внутренне переменная в php может иметь имя в виде строки или числа, но когда парсер или транслятор разбирает код он проверяет имена на соответствие чемуто похожему на регулярное выражение указанное выше, а поскольку имя не соответствует то выдаёт ошибку. Таким образом с помощью синтаксиса с фигурными скобками мы обходим проверку парсером переменной на валидность имени. Вопрос заключается в следующем: это нормальное задокументированное поведение или нет. И если это нормально дайте ссылку на какое-нибудь описание этой особенности.

(Отредактировано автором: 06 Августа, 2013 - 22:53:28)

 
 Top
OrmaJever Модератор
Отправлено: 06 Августа, 2013 - 23:53:38
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




А по-моему тема даже очень интересна. Лично я не знал о таком.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
EuGen Администратор
Отправлено: 06 Августа, 2013 - 23:56:03
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Хорошо, поясню - правило, указанное в документации, относится только к случаю прямого именования переменных или иных строковых лексем (имён функций и методов, например) путём указания строковых литералов. Так как PHP предоставляет возможности полифорфизма кода (eval и т.п.) времени исполнения, то в общем случае данное правило не следует считать применимым во всех случаях.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
OrmaJever Модератор
Отправлено: 06 Августа, 2013 - 23:59:00
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




EuGen вопрос был "задокументирована ли эта возможность и если да то где?"
В офф документации написано что так вообще возможно? Или в php есть синтаксические особенности которые нужно искать самим?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DelphinPRO
Отправлено: 07 Августа, 2013 - 00:18:35
Post Id



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


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


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




OrmaJever пишет:
Или в php есть синтаксические особенности которые нужно искать самим?

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

(Отредактировано автором: 07 Августа, 2013 - 00:20:14)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
_Dark_
Отправлено: 07 Августа, 2013 - 15:30:22
Post Id


Частый гость


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


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

[+]


Какая разница, было задокументировано или нет, не надо так писать и все.
 
 Top
deniel1987
Отправлено: 07 Августа, 2013 - 16:27:15
Post Id


Новичок


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


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




_Dark_ пишет:
Какая разница, было задокументировано или нет, не надо так писать и все.
Разумеется переменные с таким иминем я не использую, я просто столкнулся с тем что имя свойства объекта надо было проверить на валидность, вот и встал вопрос, а что такое валидность с точки зрения php в отношении имён;

Вот ещё интересный рабочий пример:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. ${'           ___.-~"~-._   __....__
  4.            ."    `    \ ~"~        ``-.
  5.           /` _      )  `\              `\
  6.          /`  a)    /     |               `\
  7.         :`        /      |                 \
  8.    <`-._|`  .-.  (      /   .            `;\\
  9.     `-. `--"_."-.;\___/"   .      .       | \\
  10.  _     /:--`     |        /     /        ."  \\
  11. ("\   /`/        |       "     "         /    :`;
  12. `\"\_/`/         .\     /`~`=-.:        /     ``
  13.   `._."          /`\    |      `\      /(
  14.                 /  /\   |        `Y   /  \
  15.           jgs  J  /  Y  |         |  /`\  \
  16.               /  |   |  |         |  |  |  |
  17.              "---"  /___|        /___|  /__|
  18. '} = 'elephant';
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. echo ${'           ___.-~"~-._   __....__
  26.            ."    `    \ ~"~        ``-.
  27.           /` _      )  `\              `\
  28.          /`  a)    /     |               `\
  29.         :`        /      |                 \
  30.    <`-._|`  .-.  (      /   .            `;\\
  31.     `-. `--"_."-.;\___/"   .      .       | \\
  32.  _     /:--`     |        /     /        ."  \\
  33. ("\   /`/        |       "     "         /    :`;
  34. `\"\_/`/         .\     /`~`=-.:        /     ``
  35.   `._."          /`\    |      `\      /(
  36.                 /  /\   |        `Y   /  \
  37.           jgs  J  /  Y  |         |  /`\  \
  38.               /  |   |  |         |  |  |  |
  39.              "---"  /___|        /___|  /__|
  40. '};
  41.  
  42. ?>

В любом случае спасибо всем кто откликнулся.
 
 Top
_Dark_
Отправлено: 07 Августа, 2013 - 18:38:06
Post Id


Частый гость


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


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

[+]


deniel1987 пишет:
я просто столкнулся с тем что имя свойства объекта надо было проверить на валидность

Зачем это проверять во время исполнения?
 
 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