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 :: 2 вопроса

 PHP.SU

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


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

> Без описания
Pavelbeginner
Отправлено: 12 Октября, 2011 - 20:50:33
Post Id



Частый посетитель


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


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




1) Для начала хотел бы уточнить, что есть объявление, а что есть определение переменной.
2) В обучалке пишется, что обращение к несуществующей переменной вызывает ошибку. Но почему-то, когда я обращаюсь к несуществующей переменной вот так:
PHP:
скопировать код в буфер обмена
  1.  
  2. if($test)
  3.     echo 'hello';
  4. else
  5.     echo 'world';
  6.  

то к ошибке это не приводит, код работает как надо. В чём причина? Или же ошибка на самом деле есть, но она не выводится php? И, если ошибка все же есть, то почему программа работает дальше?

(Отредактировано автором: 12 Октября, 2011 - 20:54:31)

 
 Top
Champion Супермодератор
Отправлено: 12 Октября, 2011 - 20:55:16
Post Id



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


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


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




1) Объявление переменной - это момент, когда мы указываем ее тип или просто каким-нибудь образом делаем, чтоб она начала существовать. Как в php выглядит объявление переменной, я честно говоря, затрудняюсь представить,но вот в С:
int var;
char *string;
Тут просто объявили, но значение в этой переменной не несет никакого смысла и может вообще содержать всякие неожиданности.
А когда мы присвоим что-то - то мы определим переменную:
string = "sssssss";
Можно сразу обявить и определить:
int i = 94;

2) Будет не ошибка, будет замечание. Оно и происходит, просто их показ или фиксирование выключены.
Yandex -> error_reporting, ini_set, display_errors
 
 Top
OrmaJever Модератор
Отправлено: 12 Октября, 2011 - 21:11:54
Post Id



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


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


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




По первому вопросу только хотел написать пример из С но видимо Champion подумал имено так.
Champion пишет:
Как в php выглядит объявление переменной, я честно говоря, затрудняюсь представить

из-за нечёткой типизации обьявление переменой выглидит так
PHP:
скопировать код в буфер обмена
  1. $text = '';
  2. // и вот пример
  3. $text = ''; // переменая типа string
  4. for($i=0;$i<10;++$i) {
  5.   $test .= $i; // $test нужно обязательно объвить.
  6. }

Вобще обьявление и определение в php не имеет большой разницы.
Pavelbeginner пишет:
Или же ошибка на самом деле есть, но она не выводится php?

Вы сами всё поняли Улыбка При обращении к несуществующей переменой нотис будет всегда, а вот увидите вы его или нет зависит от настроек. Champion написал где и что искать


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Pavelbeginner
Отправлено: 12 Октября, 2011 - 21:30:11
Post Id



Частый посетитель


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


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




Спасибо. А еще вопросы небольшие. При обращение к несуществующей переменной, как я понял, интерпретатор присваивает переменной тип Null. В моем примере if($test), переменной $test присваивается значение и тип null, а дальше происходит автоматическое преобразование типа null в тип boolean? И исходя из того, что обращение к несуществующей переменной это ошибка(хотя на ход программы это не повлияет), то значит ли, что правилом хорошего тона будет везде перед обращением к переменным проверять их существование следующим образом:
PHP:
скопировать код в буфер обмена
  1.  
  2. if(isset($test))
  3.     if($test == 5)
  4.         echo 'hello';
  5.  

Или же программисты закрывают на это глаза?

(Отредактировано автором: 12 Октября, 2011 - 21:33:20)

 
 Top
LIME
Отправлено: 12 Октября, 2011 - 21:36:27
Post Id


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


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


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




OrmaJever пишет:
$text = '';
это скорее инициализация
а объявления в php вообще нет
потому что память заранее не выделяется
поправьте если что
Pavelbeginner пишет:
При обращение к несуществующей переменной, как я понял, интерпретатор присваивает переменной тип Null.
пустое значение насколько я знаю присваивается '' , а оно в сравнении FALSE
 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Октября, 2011 - 21:38:03
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




int, var, struct... В сишках идет сперва явное описание всех ресурсов и переменных, задание их типов.. Если дальше в коде пытаться впихнуть невпихуемое, например строку как значение в ранее определенный для хранения целых чисел ресурс - это вызовет ошибку. В принципе очень верный подход - думай что пишешь.

Те же моменты можно найти и в JS - а ну ка алертни объект или массив, что будет?
Ша - to.String

PHP - веяния ООП дают некоторые "наставления" к структуризации и типизации.
Сперва описание - затем манипуляции.
(Добавление)
LIME пишет:
а оно в сравнении FALSE

if ($var === null) ...
elseif ($var === false) ...
else ...
 
 Top
LIME
Отправлено: 12 Октября, 2011 - 21:39:37
Post Id


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


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


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




Pavelbeginner пишет:
то значит ли, что правилом хорошего тона будет везде перед обращением к переменным проверять их существование следующим образом:
практичнее инициализировать значением по умолчанию
(Добавление)
DeepVarvar ага ...null
 
 Top
Pavelbeginner
Отправлено: 12 Октября, 2011 - 22:02:50
Post Id



Частый посетитель


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


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




Ну и последний мини-вопрос касательно этой темы. Значит, если я объявлю переменную, как $test = null, а затем обращусь к ней, то это не считается ошибкой, а если переменная не существует и я к ней обращаюсь, то это считается ошибкой и этой переменной php автоматически присваивает значение и тип null и значение null, при повторном же обращение к этой переменной ошибки уже не будет, верно?
 
 Top
LIME
Отправлено: 12 Октября, 2011 - 22:09:19
Post Id


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


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


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




Pavelbeginner пишет:
Значит, если я объявлю переменную, как $test = null
проициализируете
Pavelbeginner пишет:
то это считается ошибкой и этой переменной
нет это не ошибка
выводится предупреждение
тоесть вполне возможно что это ошибка (потенциальная)
поэтому надо инициализировать и если есть предупреждение значит чтото не так и надо пересмотреть код
(Добавление)
Pavelbeginner пишет:
при повторном же обращение к этой переменной ошибки уже не будет
предупреждение не будет конечно
 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Октября, 2011 - 22:13:52
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




$a = null;
if (isset($a)) echo "x";
unset($a);
if (isset($a)) echo "y";

Подмигивание
(Добавление)
$a = 0;
if (empty($a)) echo "опа!";
 
 Top
LIME
Отправлено: 12 Октября, 2011 - 22:15:33
Post Id


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


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


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




вот пример допустим
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $str='начало текста';
  3. foreach (......) $str.='ляляля';
  4. ?>
если както в ходе работы затер инициализацию будет предупреждение
код выполнится но если появилась переменная с потолка значит есть повод проверить код
 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Октября, 2011 - 22:17:15
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Вот во что выливается не строгая типизация...
 
 Top
LIME
Отправлено: 12 Октября, 2011 - 22:23:00
Post Id


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


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


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




часто помогает в случае ошибки в написании переменной
возможно код и проработает както но не надо ))
 
 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