Как многие из вас уже знают, PHP 5.4 alpha был выпущен. У меня есть вопрос относительно следующего.
Упрощенное считывание строк.
$str[1][0]
теперь является законной конструкцией.
Как работает $str[1][0]
?
Как многие из вас уже знают, PHP 5.4 alpha был выпущен. У меня есть вопрос относительно следующего.
Упрощенное считывание строк.
$str[1][0]
теперь является законной конструкцией.
Как работает $str[1][0]
?
Это побочный эффект и упоминается здесь в предложении: 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".
Я собираюсь зафиксировать патч в случае без возражений.
Спасибо. Дмитрий.
Это просто означает, что при чтении сдвига строки PHP снова возвращает строку, в которой вы снова можете получить доступ к смещению. (И на этот доступ еще одно смещение. Это смешно с $str[0][0][0][0][0][0]
)
Перед PHP 5.4 вы получите ошибку "Невозможно использовать строковое смещение как массив".
Это может создать некоторые интересные ошибки при обновлении кода с php 5.3 до 5.4.
В 5.3 эта конструкция вернет false:
$array = array("This is a string");
echo isset($array[0][0][0]);
В 5.4 это вернет true.