Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: обращение не к массиву как к массиву не вызывает ошибки
 
 автор: Igorek   (27.11.2013 в 15:39)   письмо автору
 
 

<?php
$a 
false;
var_dump($a['key']); // NULL
$a 'false';
var_dump($a['key']); // string(1) "f"
$a 12;
var_dump($a['key']); // NULL
$a null;
var_dump($a['key']); // NULL
$a = new stdClass();
var_dump($a['key']); // PHP Fatal error:  Cannot use object of type stdClass as array


для меня стало откровением поведение php в первом, третьем и четвертом случаях. Почему php не выбрасывает даже несчастного нотиса в таком случае? Это ожидаемое поведение?

  Ответить  
 
 автор: confirm   (27.11.2013 в 16:32)   письмо автору
 
   для: Igorek   (27.11.2013 в 15:39)
 

А нужно на действие 0 * 5 сообщать, что результатом будет 0?

  Ответить  
 
 автор: Igorek   (27.11.2013 в 19:11)   письмо автору
 
   для: confirm   (27.11.2013 в 16:32)
 

т.е. вы считаете нормальным, что на код вида:
<?php
$a 
false
echo 
$a['key'];

php не генерит ошибку/предупреждение, а молча вернув null работает себе дальше?

  Ответить  
 
 автор: confirm   (27.11.2013 в 20:05)   письмо автору
 
   для: Igorek   (27.11.2013 в 19:11)
 

Я считаю, это естественно, что у булева значения не может быть ключа, как и не стоит предупреждать на false * 12 - "Вы че, ноль же получится".

  Ответить  
 
 автор: Sfinks   (28.11.2013 в 09:20)   письмо автору
 
   для: Igorek   (27.11.2013 в 15:39)
 

Notice он обязательно выдаст. Нужно только включить вывод нотисов. В начале скрипта допишите:
<?
  ini_set
('display_errors'1);
  
error_reporting(E_ALL);

  Ответить  
 
 автор: Igorek   (28.11.2013 в 13:18)   письмо автору
 
   для: Sfinks   (28.11.2013 в 09:20)
 

Пробовали?
<?php
$a 
false;
$b = array();
$a['key'];
$b['key'];

угадайте где нотис выпадет? )

  Ответить  
 
 автор: confirm   (28.11.2013 в 13:23)   письмо автору
 
   для: Igorek   (28.11.2013 в 13:18)
 

А угадайте, выдаст ли вам РНР сообщение об этом:

<?
$b 
= array('key'=>1); 
echo 
$b[key];

  Ответить  
 
 автор: Igorek   (28.11.2013 в 13:47)   письмо автору
 
   для: confirm   (28.11.2013 в 13:23)
 

ну, скажем, что выдаст. А к чему этот пример?

  Ответить  
 
 автор: confirm   (28.11.2013 в 13:56)   письмо автору
 
   для: Igorek   (28.11.2013 в 13:47)
 

Ничего он не выдаст, даже не смотря на то, что key слово зарезервированное в РНР.
Это к тому, что указывать имя ключа без кавычек (строковое значение), это плохая привычка, однако РНР смолчит, поковыряется в области констант, и не найдя таковой изменит вашу ошибку сам - поймет, что это строка, действительное имя ключа, и найдет таковой. Но разработчики предупреждают, что так делать нельзя, ибо ошибки "писателя" РНР будет исправлять ровно до тех пор, пока имя ключа, который пользователь необдуманно ввел как константу, не будет зарезервировано в РНР. И тогда последствия могут быть не те, которые ожидаются, и РНР извещать об этом не будет.

  Ответить  
 
 автор: Igorek   (28.11.2013 в 14:47)   письмо автору
 
   для: confirm   (28.11.2013 в 13:56)
 

Всегда в таких случаях php предупреждает:
igorek@md:~/temp$ cat ttt.php
<?php
error_reporting
(E_ALL);

$b = array('key'=>1);  
echo 
$b[key]; 
igorek@md:~/tempphp ttt.php 
PHP Notice
:  Use of undefined constant key assumed 'key' in /home/igorek/temp/ttt.php on line 5

Notice
: Use of undefined constant key assumed 'key' in /home/igorek/temp/ttt.php on line 5
1igorek
@md:~/temp

  Ответить  
 
 автор: confirm   (28.11.2013 в 15:15)   письмо автору
 
   для: Igorek   (28.11.2013 в 14:47)
 

Не обольщайтесь, зарезервирует за собою и молча подставит свое значение.

  Ответить  
 
 автор: Sfinks   (28.11.2013 в 23:36)   письмо автору
 
   для: Igorek   (28.11.2013 в 13:18)
 

Да, забавно =)
Хам он, что я еще могу сказать =)

  Ответить  
 
 автор: MHz   (28.11.2013 в 18:36)   письмо автору
 
   для: Igorek   (27.11.2013 в 15:39)
 

В документации, даже на русском, написано:
Попытка доступа к неопределенному ключу в массиве - это то же самое, что и попытка доступа к любой другой неопределенной переменной: будет сгенерирована ошибка уровня E_NOTICE, и результат будет NULL.

  Ответить  
 
 автор: Igorek   (28.11.2013 в 21:20)   письмо автору
 
   для: MHz   (28.11.2013 в 18:36)
 

Речь о другом

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования