Использование переменной без объявления в качестве аргумента функции

#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 в приведенной выше цитате).