Вопрос

Доктор

Новичок
Вопрос

Проверьте плз, что выдает:

PHP:
<?
  $a=array(&$b);
  echo (int)isset($a);
?>

По логике должно выдавать 1-цу, и у меня дома, да и на всех "нормальных" :) хостингах выдает 1-цу. Но вот на некоторых хостингах выдает 0. А что у вас?
Кто-то знает от чего это зависит, от каких настроек или чего-либо другого, и как это исправить (чтобы как положено была 1)?

Очень важный для меня вопрос, так как там, где 0, при некоторых специфических действиях возникает крэш. Т.е. валится ПХП. Выдает 404, либо выдает обрезанную на месте вызова специфической функции страницу. Причем логика когда 404, а когда просто вылетает, неясна. Может быть, связано с output buffering, но проверить забыл, да и не столь важно. А важно именно, что валится ПХП.
Причем этот баг не зависит от версии ПХП. У меня дома он никогда не возникал ни на одной из версий, но наблюдал я его и на 4.03, и на 4.1, и на 4.2, и на 4.2.3... Наодном хостинге он появился, потом пропал (уж не знаю, что там админ сделал), на другом хостинге его в помине не было, пока стоял ПХП 4.2.1, а когда поставили 4.2.3 - появился :(
Перерывал весь php.ini - ничего не дало, ничего не нашел. Да и теоретически не может оно зависеть от настроек: ведь возникает не просто ошибка, а именно крэш.
Кто-то может предположить в чем дело?
 

Доктор

Новичок
ONK: это, безусловно, замечательно, что 1. Но, извините, если кто не понял, но меня в первую очередь интересуют те, у кого 0, и что они могут сказать в свое оправдание :). Т.е. голая информация о том, что у тебя 1, безусловно, сама по себе уже очень полезна мне :), но я все же рассчитываю на какие-то мысли кроме этого.
 

Доктор

Новичок
ГраждАне! Тут же столько знатоков тусуется. Что, никто никогда не сталкивался ни с чем подобным?
 

tony2001

TeaM PHPClub
никто не хранит ссылки в массиве.
вообще, тема ссылок в РНР достаточно скользкая, ничего удивительного в таких вещах не вижу.
впрочем, в том, что тебе никто не ответил в субботу - тоже ничего удивительного.
храни не ссылку, а переменную, думаю, что будет нормально работать, хотя мог бы и сам попробовать.
 

Доктор

Новичок
tony2001: наверное, стоит предположить, что, наверное, я что-то делаю так-то, потому что мне так надо. И я привел этот пример и дал пояснения не для того, чтобы услышать в ответ поучения как надо программирововать. Если нечего сказать по конкретному вопросу, то зачем мне твои примычания к жизни? Или ты скажешь, что то, что ты написал хоть как-то отвечает на мой вопрос или хотя бы пытается это сделать? Или, может, кто-то скажет, что я не умею вопросы задавать и должен с благодарностью принимать подобные "ответы"?
 

[VS]

Guest
Автор оригинала: Доктор
ГраждАне! Тут же столько знатоков тусуется. Что, никто никогда не сталкивался ни с чем подобным?
Ты везде тестируешь именно приведенные тобою 2 строки, или нечто большее?
Если нечто большее - то приводи полный код. Если нет - то несколько странно брать ссылку не существующей переменной $b.
 

Доктор

Новичок
Frol: зла у меня просто не хватает на таких, как ты. Поэтому скажу тебе только, что у тебя дело (читай "проблемы") в твоей голове, раз ты это написал.

[VS]:
Ты везде тестируешь именно приведенные тобою 2 строки, или нечто большее?
Как я уже писал в самом первом постинге, само-собой, данные 2 строчки просто демонстрируют наличие этого бага. Ссылку несуществующей переменой брать, оно конечно, страно :), но массив-то при этом там, где все нормально, как и должно быть по законам логики, все же создается, а вот кое-где нет. В коде, который валит ПХП, вообще, естественно идет развитие данных действий, массив передается в функцию и в ней идет с ним работа.
Вообще, есть тут кто-то у кого данный код все же 0 выдает?
 

Crazy

Developer
Почему "должен создаваться"? Видим сылку на несуществующую переменную и фиксируем ошибку. Ошибка перехватывается и выполнение идет со следующего оператора. Имеем нормальный ноль.
 

Доктор

Новичок
Crazy: у тебя 0?
Потому что на самом деле имеем практически везже нормальную удиницу. И только редко где 0. Причем там, где 0, при дальнейших действиях воникает ни много ни мало, а крэш, а не ошибка какая-либо, что в любом случае ненормально...
 

Доктор

Новичок
Выяснил я все подробности страшной правды :)) Поразительные вещи творятся...

PHP:
<?

$a=&$b;
echo (int)isset($a);

$a1=array(&$b1);
echo (int)isset($a1);

$a=array(&$b);
echo (int)isset($a);

?>
Этот код на этом хостинге, где баг присутствует, выдает 001. Т.е. второй раз $a как будто бы уже существует.
Также выяснил, что крэш вызвывает всего-то единственная операция:
$a=array(&$b);
Но только в большом и сложном файле, где до этого было уже десять инклюдов всяких, множество операций и т.д. (но при этом таких переменных, как $a и $b еще не существовало). В таком вот коротком коде, как тут привожу крэш не происходит. При этом интересно, что
$a=&$b;
Крэша не вызывает...
Кошмар, короче.
 

[VS]

Guest
Доктор: Я одного не понимаю - зачем брать ссылку на не существующую переменную и потом жаловаться на проблемы?
Если у тебя в коде берется ссылка на не существующую переменную - фиксь код.
Я согласен что PHP ведет себя в данном случае не правильно, но проблем в этом не вижу - код правильно писать нужно.
 

PilotV

Guest
Не, дорогая редакция, я уею...
Человек конкретнее некуда описал ситуацию и задал конкретнее некуда вопрос, и тут же лезет толпа, которая по сути сказать ничего не может, зато авторитетно берется учить писать правильно код (интересно, ей понятие "крэш" вообще знакомо?).
Типо если чего-то не понимаю - зачем мозги напрягать, посоветую-ка я другому правильно программировать, так сразу от этого умным буду казаться... другим таким же умным как сам.
 

ONK

Пассивист PHPСluba
Извини но тот пример был либо выдран из контекста скрипта (в этом случае обсуждать просто нечего), либо взят из отвратительно написанного скрипта с необъявленными переменными, на что и было указано. Но если просят хотябы протестировать, то меня не заломает протестировать, что я и сделал.
 

PilotV

Guest
Если кого-то интересует, зачем оно так надо, то да, этот пример выдран из контеста скрипта. Но никого не просили делиться своими соображениями по поводу исккуства кодинга, высказывать свое мнение о данной конструкции и необходимости ее использования с т.з. судеб человечества.
С точки же зрения сути проблемы всё описано до немогу точно и достаточно, и сверхдостаточно для того, чтобы тот, кто мог и имел желание не флудить, а подумать о ней, мог сделать это.
 

Доктор

Новичок
Ну, может действительно выходные просто. Еще остается шанс, что в понедельник кто-то чего-нить скажет умного (умного без кавычек)
 

Barlone

Guest
Совершенно дурацкий код:
PHP:
<? error_reporting(E_ALL);

  $a=array(&$b); 

  $a[0]="Test";

  echo (int)is_null($a);

  echo $b;

?>
И результат выполнения:
Код:
Notice: Undefined variable: b in /home/servers/test/t.php on line 3
1
Notice: Undefined variable: b in /home/servers/test/t.php on line 9
Test
Что мы видим ? Первое сообщение - на строке $a=array(&$b); все логично. Но вот дальше... echo (int)is_null($a); выдает 1. Гм, и это после $a[0]="Test";
Но самое интересное - последняя строка: echo $b;
Выдается сообщение, что переменная неопределена, И ПОСЛЕ ЭТОГО ПЕЧАТАЕТ ЕЕ ЗНАЧЕНИЕ "Test" Явно баг в РНР

РНР 4.2.3 (Apache module), на Linux'e
 
Сверху