Упрощенное чтение смещения строк в PHP 5.4 - PullRequest
10 голосов
/ 05 июля 2011

Как многие из вас уже знают, выпущена PHP 5.4 alpha. У меня есть вопрос относительно следующего.

Упрощенное чтение смещения строки. $str[1][0] теперь является легальным конструктом.

Как именно $str[1][0] работает?

РЕДАКТИРОВАТЬ: http://php.net/releases/NEWS_5_4_0_alpha1.txt

Ответы [ 3 ]

11 голосов
/ 05 июля 2011

Это просто означает, что при чтении смещения строки PHP снова возвращает строку, по которой вы снова можете получить доступ к смещению. (И на этом доступе еще одно смещение. Это смешно с $str[0][0][0][0][0][0])

До PHP 5.4 вы получали ошибку «Невозможно использовать смещение строки как массив».

7 голосов
/ 06 июля 2011

Это побочный эффект, который был упомянут в предложении здесь: http://php.markmail.org/thread/yiujwve6zdw37tpv

Функция - скорость / оптимизация смещения строк.

Привет,

Недавно я заметил, что чтение смещения строки выполняется в два этапа.Сначала в zend_fetch_dimension_address_read () создается специальный вариант string_offset для параметра virtual_variable, а затем в _get_zval_ptr_var_string_offset () создается значение реальной строки.

Я думаю, что мы можем создать настоящую строку в первую очередь.Это на 50% ускоряет операцию чтения смещения строки и позволяет исключить некоторые проверки и условные бранчи в ВМ.

Патч прикреплен (не забудьте перегенерировать zend_vm_execute.h для его тестирования).Однако это меняет поведение в одном фиктивном случае.Следующий код теперь выдаст «b» (в настоящее время он генерирует фатальную ошибку - не может использовать смещение строки в качестве массива).

$str = "abs";
var_dump($str[1][0]);

Я думаю, что это совсем не проблема.«b» имеет смысл, потому что «abs» [1] -> «b» и «b» [0] -> «b».

Я собираюсь зафиксировать патч в случае отсутствия возражений.

Спасибо.Дмитрий.

1 голос
/ 12 февраля 2013

Это может создать некоторые интересные ошибки при обновлении кода с php 5.3 до 5.4.

В 5.3 эта конструкция будет возвращать false:

$array = array("This is a string");

echo isset($array[0][0][0]);

В 5.4 это вернет true.

...