PHP 5.4 упрощенное считывание строк

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

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

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

EDIT: http://php.net/releases/NEWS_5_4_0_alpha1.txt

Ответ 1

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

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

Привет,

Недавно я заметил, что чтение смещение строки выполняется в двух шаги. Сначала специальный string_offset Вариант временного_переменной созданный в zend_fetch_dimension_address_read() и тогда истинное значение строки созданный в _get_zval_ptr_var_string_offset().

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

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

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

Я думаю, что это не проблема. "Б" имеет смысл, потому что "abs" [1] → "b" и "b" [0] → "b".

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

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

Ответ 2

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

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

Ответ 3

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

В 5.3 эта конструкция вернет false:

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

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

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