5.0.5 > 5.1.2 Migration

XtremallyPurpur

Новичок
5.0.5 > 5.1.2 Migration

Добрый день.

На 5.0.5 работало следующее:
PHP:
preg_match('/module=([^&]*)/', $_SERVER['REQUEST_URI'], $matches=array());
После вызова функции:
Код:
$matches == array(0=>"module=calls", 1=>"calls");
Ожидаемый вывод, все нормально.

Обновился до 5.1.2. Массив $matches после вызова preg_match - пустой.

Тогда пишу так:
PHP:
preg_match('/module=([^&]*)/', $_SERVER['REQUEST_URI'], $matches);
После вызова функции:
Код:
$matches == array(0=>"module=calls", 1=>"calls");
Т.е. - работает.

Вопросы такие:
1. С чем связано такое поведение?
2. Почему не генерится Notice во втором случае, ведь $matches - локальная переменная и нигде ранее не определена, а передается по ссылке?
 

tony2001

TeaM PHPClub
>Почему не генерится Notice
а почему он должен генериться?

PHP:
function foo(&$var) {
  $var = 1;
}
foo($undefined);
var_dump($undefined);
понятно?

>С чем связано такое поведение?
error_reporting = E_ALL|E_STRICT, тебе расскажут.
$matches=array() - выражение, которое ты пытаешься передать по ссылке.
 

XtremallyPurpur

Новичок
tony2001

Да, спасибо, при E_STRICT вывелось, что только переменные передаются по ссылке. Я его отключил, потому что PEAR много нотисов выдает.

Но все равно не могу понять почему foo($undefined); не выдает нотис. $undefined не определенная переменная и мы пытаемся передать ссылку на нее в функцию.

Что в действительности происходит? php создает эту
переменную, и ссылка на нее передается в функции foo, так?
Так почему php не предупреждает меня о том, что я собираюсь передать в функцию не существующую переменную и php для меня ее создал?
Заглянул в php.net/references там во всех примерах переменная перед передачей ее в функцию по ссылке определяется.
 

tony2001

TeaM PHPClub
>Так почему php не предупреждает меня о том, что я собираюсь передать в
>функцию не существующую переменную и php для меня ее создал?

ну а как иначе получать данные из функций, возвращающих их по ссылке?
смысл именно в этом, так сделано специально.
 
Сверху