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
Форумы портала PHP.SU :: Версия для печати :: 2 вопроса
Форумы портала PHP.SU » » Вопросы новичков » 2 вопроса

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

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

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

2) Будет не ошибка, будет замечание. Оно и происходит, просто их показ или фиксирование выключены.
Yandex -> error_reporting, ini_set, display_errors
3. OrmaJever - 12 Октября, 2011 - 21:11:54 - перейти к сообщению
По первому вопросу только хотел написать пример из С но видимо 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 написал где и что искать
4. Pavelbeginner - 12 Октября, 2011 - 21:30:11 - перейти к сообщению
Спасибо. А еще вопросы небольшие. При обращение к несуществующей переменной, как я понял, интерпретатор присваивает переменной тип Null. В моем примере if($test), переменной $test присваивается значение и тип null, а дальше происходит автоматическое преобразование типа null в тип boolean? И исходя из того, что обращение к несуществующей переменной это ошибка(хотя на ход программы это не повлияет), то значит ли, что правилом хорошего тона будет везде перед обращением к переменным проверять их существование следующим образом:
PHP:
скопировать код в буфер обмена
  1.  
  2. if(isset($test))
  3.     if($test == 5)
  4.         echo 'hello';
  5.  

Или же программисты закрывают на это глаза?
5. LIME - 12 Октября, 2011 - 21:36:27 - перейти к сообщению
OrmaJever пишет:
$text = '';
это скорее инициализация
а объявления в php вообще нет
потому что память заранее не выделяется
поправьте если что
Pavelbeginner пишет:
При обращение к несуществующей переменной, как я понял, интерпретатор присваивает переменной тип Null.
пустое значение насколько я знаю присваивается '' , а оно в сравнении FALSE
6. DeepVarvar - 12 Октября, 2011 - 21:38:03 - перейти к сообщению
int, var, struct... В сишках идет сперва явное описание всех ресурсов и переменных, задание их типов.. Если дальше в коде пытаться впихнуть невпихуемое, например строку как значение в ранее определенный для хранения целых чисел ресурс - это вызовет ошибку. В принципе очень верный подход - думай что пишешь.

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

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

if ($var === null) ...
elseif ($var === false) ...
else ...
7. LIME - 12 Октября, 2011 - 21:39:37 - перейти к сообщению
Pavelbeginner пишет:
то значит ли, что правилом хорошего тона будет везде перед обращением к переменным проверять их существование следующим образом:
практичнее инициализировать значением по умолчанию
(Добавление)
DeepVarvar ага ...null
8. Pavelbeginner - 12 Октября, 2011 - 22:02:50 - перейти к сообщению
Ну и последний мини-вопрос касательно этой темы. Значит, если я объявлю переменную, как $test = null, а затем обращусь к ней, то это не считается ошибкой, а если переменная не существует и я к ней обращаюсь, то это считается ошибкой и этой переменной php автоматически присваивает значение и тип null и значение null, при повторном же обращение к этой переменной ошибки уже не будет, верно?
9. LIME - 12 Октября, 2011 - 22:09:19 - перейти к сообщению
Pavelbeginner пишет:
Значит, если я объявлю переменную, как $test = null
проициализируете
Pavelbeginner пишет:
то это считается ошибкой и этой переменной
нет это не ошибка
выводится предупреждение
тоесть вполне возможно что это ошибка (потенциальная)
поэтому надо инициализировать и если есть предупреждение значит чтото не так и надо пересмотреть код
(Добавление)
Pavelbeginner пишет:
при повторном же обращение к этой переменной ошибки уже не будет
предупреждение не будет конечно
10. DeepVarvar - 12 Октября, 2011 - 22:13:52 - перейти к сообщению
$a = null;
if (isset($a)) echo "x";
unset($a);
if (isset($a)) echo "y";

Подмигивание
(Добавление)
$a = 0;
if (empty($a)) echo "опа!";
11. LIME - 12 Октября, 2011 - 22:15:33 - перейти к сообщению
вот пример допустим
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $str='начало текста';
  3. foreach (......) $str.='ляляля';
  4. ?>
если както в ходе работы затер инициализацию будет предупреждение
код выполнится но если появилась переменная с потолка значит есть повод проверить код
12. DeepVarvar - 12 Октября, 2011 - 22:17:15 - перейти к сообщению
Вот во что выливается не строгая типизация...
13. LIME - 12 Октября, 2011 - 22:23:00 - перейти к сообщению
часто помогает в случае ошибки в написании переменной
возможно код и проработает както но не надо ))

 

Powered by ExBB FM 1.0 RC1