Загадка на миллион баксов
328 сообщений
584 сообщения
#15 лет назад
Выход приведение типов
<?php
a(0,(int)$$var);
$temp1=1;
$temp2=2;
echo $temp1;
function a($b,$c) {}
или передача по ссылке
<?php
a(0,$$var);
$temp1=1;
$temp2=2;
echo $temp1;
function a($b,&$c) {}
1172 сообщения
#15 лет назад
SField, на самом деле выход - не использовать неопределенные переменные. Но такого эффекта не должно быть при любых раскладах.
2817 сообщений
#15 лет назад
Цитата ("tvv"):Это баг PHP 5.3.* (проверяли в 5.3.0 и в 5.3.2).
У меня рнр 5.3.0 - этого бага нет. Рнр работает на х64 ос на локальном ПК.
unset($temp1);
unset($temp2);
$temp1='бред';
$temp2='собачий';
echo $temp1;
die;
результат
бред
3240 сообщений
#15 лет назад
Цитата ("kirilev"):У меня рнр 5.3.0 - этого бага нет. Рнр работает на х64 ос на локальном ПК.
Попробуйте другой пример, см. мое сообщение на предыдущей странице, вчера 18:05.
2817 сообщений
#15 лет назад
Цитата ("tvv"):Попробуйте другой пример, см. мое сообщение на предыдущей странице, вчера 18:05.
Да, действительно:
a(0,$$var);
$temp1 = 1;
$temp2 = 2;
$temp3 = 3;
echo $temp1;
function a($b,$c) {}
выводит: 3 вместо 1.
К чему я пришел:
собака зарыта в вызове фукнции а(), где второй параметр переменная переменной $var, у нас $var не упоминается в коде, потому при попытке передать несуществующую переменную переменной как второй аргумент функции - интерпретатор дурет (что собственно логично) если сделать:
error_reporting(E_ALL);
a(0,$$var);
$temp1 = 1;
$temp2 = 2;
$temp3 = 3;
echo $temp1;
function a($b,$c) {}
в ответ получим:
Notice: Undefined variable: var in D:\xampp\htdocs\server\test_001\index.php on line 5
Notice: Undefined variable: in D:\xampp\htdocs\server\test_001\index.php on line 5
3
вторая строчка - это и есть намёк на ошибку использования $$.
если сделать:
error_reporting(E_ALL);
$var = 0;
$$var = 0;
a(0,$$var);
$temp1 = 1;
$temp2 = 2;
$temp3 = 3;
echo $temp1;
function a($b,$c) {}
Получим 1, что и должны были получить..
Это очередной раз доказывает: нужно смотреть что куда передаём, обнулять значения переменных и т.п... не леница, следить и обрабатывать данные, над которыми работает скрипт\алгоритм\функция у кого что..
..особенно в рнр, который не требует обязательного оглашения переменный перед использованием.
Да.. рнр - лёгкие деньги.. сел, написал как-то.. как-то заработало.. оплату получил - смылся... не то что какой-то компилированный язык.. ))..
99 сообщений
#15 лет назад
kirilev, тогда уж компилируемый язык. Никто не мешает и на ПХП писать достойно.
Может сайты на АСМе писать?


328 сообщений
1172 сообщения
#15 лет назад
Цитата ("kirilev"):интерпретатор дурет (что собственно логично)
Объясните, пожалуйста, каким местом это логично?
Баг в моем коде через целую череду случайностей спровоцировал баг в php. Во-первых, переменная должны была быть неопределена (это мой баг). Во-вторых, она должна следом использоваться как переменная переменная. В-третьих, она должна передаваться в функцию именно вторым параметром. И в дальнейшем это отражается не на работе самой функции, а на совершенно другом участке кода.
Вот только не надо путать наличие багов в разрабатываемом скрипте и их наличие в релизе. С утра я скопировал готовый модуль с сервера (где пришлось его доделывать) на комп и проблема прошла сама собой, т.к. ошибки уже не было. И если бы Вадим не интересовался этим багом, то я просто забил бы на него, т.к. в готовом коде его уже не было. Но только ради того, что tvv уже потратил время на разбор ситуации, специально откатил изменения на сутки и продолжили копать, что и привело к такому "открытию".
Просто запомните одну истину: баги допускают все. Но кто-то их игнорирует, кто-то правит, а у кого-то они в голове.
328 сообщений
450 сообщений
2817 сообщений
#15 лет назад
Цитата ("Lisio"):Объясните, пожалуйста, каким местом это логично?
Это относится к тому куску, который навел tvv, а ваш код у меня работает как надо, о чём писал немного выше.
Тем местом - была попытка выполнить действия над неопределёнными данными (передать переменную переменной $var которая не определена).. в таком случае нельзя ожидать верный результат...
1172 сообщения
#15 лет назад
Цитата ("kirilev"):Это относится к тому куску, который навел tvv, а ваш код у меня работает как надо, о чём писал немного выше.
А мой код у вас не может работать как надо, так как выдернуто около 500 строк предыдущего кода.
Цитата ("kirilev"):
в таком случае нельзя ожидать верный результат...
Верный результат работы функции, в которую передавалась неинициализированная $$ - нельзя ожидать. Верный результат работы кода, который с этим блоком совершенно не связан - можно и нужно ожидать.