Вопрос

kvn

programmer
PHP:
 error_reporting(E_ALL);
  $a=array(&$b);
  echo (int)isset($a);
  $a[0]="Test";
  echo (int)is_null($a);
  echo $b;
Код:
10Test
PHP 4.2.2/Apache-1.3.26/FreeBSD 4.6-STABLE
 

Barlone

Guest
Определились же: дело в ZendOptimizer
Ну все равно, создавать ссылки на несуществующие переменные не есть хорошо.
 

PilotV

Guest
Ну, если порассуждать немного вглубь, то "создавать ссылки на несуществующие переменные не есть хорошо" - я бы не сказал, что верное утверждение. Я думаю, что в нормальных условиях это совершенно легитимное действие, ничуть не опаснее, чем просто присваивание несуществующей переменной "$a=$b". Причины: недавно или тут или на вебскрипт был топик, в котором копались в механизме присваивания ПХП, и определили, что любое присваивание в ПХП по значению все равно происходит по ссылке, и данные копируются в новое место памяти только непосредственно перед их изменением. Поэтому
$a=array($b);
и
$a=array(&$b);
- по действию совершенно равноправны, и у 2-го вызывать ошибку (не говоря уж о крэше) не больше поводов, чем у 1-го.
 

ONK

Пассивист PHPСluba
В мануале по ПХП описано поведение парсёра при нахождении использования необъявленной переменной, она заменяется в зависимости от контекста на 0 или пустую строку, при этом генерируется предуреждение. А вот описания действия при встрече взятия адреса от несуществующей переменной я чтото неприпоминаю... Тут можно предположить целую цепочку действий, но всё это будут только предположения, однозначно только то, что это как и использование необъявленной переменной - ошибка программиста.
 

PilotV

Guest
>> однозначно только то, что это как и использование необъявленной переменной - ошибка программиста

Ерунда. Полная.

А вот крэш при таком действии - действительно ошибка какого-то программиста.
 

shingrus

Guest
Автор оригинала: ONK
однозначно только то, что это как и использование необъявленной переменной - ошибка программиста.
это было бы так, если бы в пехепе не было автоматического создания переменных..., тогда бы мы сначала говорили компилятору выделить память , а потом уже использовать его... а ошибка здесь именно в работе пхп (зендоптимайзер???),
 

Crazy

Developer
Автор оригинала: shingrus
это было бы так, если бы в пехепе не было автоматического создания переменных...,
...при присваивании им значения. Читать значение переменной, если она не инициализирована, ошибка в любом языке. Иногда это диагностируетсы исполняющий системой (или компилятолром как в случае с Java), иногда -- нет. Ошибкой это не перестает быть.

В данном случае оказалось, что две исполняющие среды PHP (обычная и ~оптимизатор) различаются в семантике создания переменных: обычная среда создает переменные как при присваивании, так и при запросе ссылки. Оптимизированный вариант -- только при присваивании.

Поскольку создание переменной при запросе ссылки не является документированной фичей, то такое использование является ошибкой программиста, пишущего "$a = array(&$b)"
 

shingrus

Guest
ошибка в использовании недокументированных возможностей, может быть в этом и есть правда..., только вот лучше всего программы под винду работают используя как раз не документированные возможности, а результаты исследований работы виндовс разработчиками... боюсь, что оптимайзер просто не тестировали на таких ошибках..., а если есть ссылки... то должны быть и пустые, разве не так?
 
Сверху