Нет необходимости инициализировать переменные в PHP, однако это
очень хорошая практика Неинициализированные переменные имеют значение по умолчанию
их тип в зависимости от контекста, в котором они используются — логические значения
по умолчанию FALSE, целые числа и числа с плавающей точкой по умолчанию ноль, строки (например,
используется в echo) устанавливается как пустая строка, а массивы становятся пустыми
массив.
Я играл с неинициализированными переменными для игры в гольф, но программа не сделала то, что я ожидал. При рассмотрении я заметил это странное поведение (все используемые переменные неинициализированы):
php > $a = $a + 1;
PHP Notice: Undefined variable: a in php shell code on line 1
php > $b = $b - 1;
PHP Notice: Undefined variable: b in php shell code on line 1
php > $c++;
PHP Notice: Undefined variable: c in php shell code on line 1
php > $d--;
PHP Notice: Undefined variable: d in php shell code on line 1
php > var_dump($a);
int(1)
php > var_dump($b);
int(-1)
php > var_dump($c);
int(1)
php > var_dump($d);
NULL
+ 1
, - 1
, а также ++
работать как описано в руководстве. Тем не мение, --
не делает.
$a
, $b
, а также $c
может быть использован для подсчета, впоследствии. Но $d--;
не изменится $d
ценность, потому что $d
является NULL
,
Почему $d
установлен в NULL
не -1
?
Использование префиксных операторов дает те же результаты, кстати: переменная установлена в 1
за ++$v;
но NULL
за --$v;
,
От руководство:
Примечание:… Уменьшение значений NULL также не оказывает никакого влияния, но их увеличение приводит к 1.
Таким образом, унифицированная переменная получает значение NULL. Увеличивая это значение, вы получаете 1 (как NULL + 1). Но попытка уменьшения не имеет эффекта, как описано в документации.
Кроме того, есть очень хорошее объяснение в соответствующей теме.
Это может показаться нелогичным, но это является следствием модели типизации языка. Поэтому, чтобы избежать такого поведения, всегда следуйте рекомендациям: всегда инициализируйте переменные и остерегайтесь арифметических операций с нечисловыми значениями.
Других решений пока нет …