#php
#php
Вопрос:
Где в документах php определено, что можно использовать необъявленную переменную в качестве аргумента функции, например:
function parse_period(string $period) {
if (!preg_match('/blah-blah/u', $period, $matches)) return null;
// ...
}
Ответ №1:
Необъявленные переменные инициализируются при их первом использовании. Так сказано в руководстве по PHP >> Справочник по языку>> Переменные: основы:
Нет необходимости инициализировать переменные в PHP, однако это очень хорошая практика. Неинициализированные переменные имеют значение по умолчанию своего типа в зависимости от контекста, в котором они используются — логические значения по умолчанию
FALSE
равны нулю, целые числа и числа с плавающей запятой по умолчанию равны нулю, строки (например, используемые в echo) задаются как пустая строка, а массивы становятся пустым массивом.Пример #1 Значения по умолчанию для неинициализированных переменных
<?php // Unset AND unreferenced (no use context) variable; outputs NULL var_dump($unset_var); // Boolean usage; outputs 'false' (See ternary operators for more on this syntax) echo($unset_bool ? "truen" : "falsen"); // String usage; outputs 'string(3) "abc"' $unset_str .= 'abc'; var_dump($unset_str); // Integer usage; outputs 'int(25)' $unset_int = 25; // 0 25 => 25 var_dump($unset_int); // Float/double usage; outputs 'float(1.25)' $unset_float = 1.25; var_dump($unset_float); // Array usage; outputs array(1) { [3]=> string(3) "def" } $unset_arr[3] = "def"; // array() array(3 => "def") => array(3 => "def") var_dump($unset_arr); // Object usage; creates new stdClass object (see http://www.php.net/manual/en/reserved.classes.php) // Outputs: object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" } $unset_obj->foo = 'bar'; var_dump($unset_obj); ?>
Полагаться на значение по умолчанию неинициализированной переменной
проблематично в случае включения одного файла в другой, который использует
то же имя переменной. Это также серьезная угроза безопасности при
включенном register_globals.
В вашем примере $matches
используется в preg_match
качестве ссылки. Вызов preg_match
присваивает ей значение. Но прежде preg_match
чем выполнить это назначение, $matches
будет null
(см. Первый пример с var_dump
в приведенной выше цитате).