PHP 7.0.0 Beta 1 Released

confguru

ExAdmin
Команда форума
The PHP development team announces the immediate availability of PHP 7.0.0 Beta 1. This is the third pre-release of the new PHP 7 major series. All users of PHP are encouraged to test this version carefully, and report any bugs and incompatibilities in the bug tracking system.

THIS IS A DEVELOPMENT PREVIEW - DO NOT USE IT IN PRODUCTION!
Beta 1 marks the feature complete phase. From now on, fundamental changes are not to be expected. What's more, this release brings over 200 commits with about 25 reported bug fixes, as well as security, stability and other improvements. However it was delayed to catch up with the latest OpenSSL release issued on July 9th.

PHP 7.0.0 comes with new version of the Zend Engine with features such as (incomplete list):

  • Improved performance: PHP 7 is up to twice as fast as PHP 5.6
  • Consistent 64-bit support
  • Many fatal errors are now Exceptions
  • Removal of old and unsupported SAPIs and extensions
  • The null coalescing operator (??)
  • Combined comparison Operator (<=>)
  • Return Type Declarations
  • Scalar Type Declarations
  • Anonymous Classes

For more information on the new features and other changes, you can read the NEWS file, or the UPGRADING file for a complete list of upgrading notes. These files can also be found in the release archive.

For source downloads of PHP 7.0.0 Beta 1 please visit the download page, Windows source and binaries can be found on windows.php.net/qa/.

The next release will be Beta 2, which is to be released on the 23rd of July. You can also read the full list of planned releases on our wiki.

Thank you for helping us make PHP better.

Читать дальше...
 

newARTix

Новичок
Цитата с хабра
1. Во время итерирования массивов по значению, foreach теперь пользуется копией массива, и его изменения внутри цикла не повлияют на поведение цикла:
Код:
$array = [0, 1, 2];
$ref =& $array; // необходимо, чтобы включить старое поведение
foreach ($array as $val) {
var_dump($val);
unset($array[1]);
}
Код напечатает все значения (0 1 2), ранее второй элемент выкидывался — (0 2).

2. Когда итерируются массивы по ссылке, изменения в массиве будут влиять на цикл. Предполагается, что PHP лучше будет отрабатывать ряд случаев, например, добавление в конец массива:
Код:
$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}

проитерирует и добавленный элемент. Вывод будет «int(0) int(1)», ранее было только «int(0)».
Что называется "удачной отладки, суки!" Так я не понял, в первом примере $ref =& $array; заставит foreach проитерировать копию массива (три элемента) или сам масив (два элемента). Почему наличие где-то ссылки на массив влияет на foreach?


А вот это вообще шик:
...трейсы в исключениях не будет выводить оригинальные значения, а уже измененные:
Код:
function foo($x) {
$x = 42;
throw new Exception;
}
foo("string");
теперь выдаст:
Stack trace: #0 file.php(4): foo(42) #1 {main}

Ранее было бы так:
Stack trace: #0 file.php(4): foo('string') #1 {main}

Хоть это и не влияет на исполнение, но следует иметь это в виду при отладке. То же ограничение теперь и в debug_backtrace() и прочих функциях, исследующих аргументы.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А разве пхп не всегда пользовался копией массива?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А, перечитал, понял. Да, BC ломается довольно сильно, но как по мне — это поведение лучше дефолтного. Если хочешь итерировать переменнные данные — while в руки, это семантически логичней.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Тебя только это смутило? Там дальше вещи пострашнее есть.
 

fixxxer

К.О.
Партнер клуба
foreach ($array as $val) {
var_dump($val);
unset($array[1]);
}
Это совершенно бредовый код, и ни одного не бредового применения этого сайдэффекта не приходит в голову.

Что-то такое:
PHP:
foreach ($array as $key => $val) {
    if ($key == 1) {
        unset($array[1]);
        continue;
    }
}
будет работать совершенно одинаково.
 

newARTix

Новичок
На самом деле да, подумал как я раньше применял подобное и понял, что в таком неоднозначном виде (когда ансетится элемент до которого ещё не дошла очередь) я такое не применял вообще. Но непонятно это замечание про ссылку, там опечатка?
 

MiksIr

miksir@home:~$
Что называется "удачной отладки, суки!" Так я не понял, в первом примере $ref =& $array; заставит foreach проитерировать копию массива (три элемента) или сам масив (два элемента). Почему наличие где-то ссылки на массив влияет на foreach?
Влияло раньше. Решили упорядочить, что бы такого не было. Свели к двум случаем - итерация по значению как итерация по копии и итерация по ссылке как итерация по исходному массиву.
А вот это вообще шик
Это так работает phpng, увы. Как я понял - решили отказаться от лишнего копирования zval-ов в стеке, но как итог - нигде не хранятся значения, с которыми функция была вызвана.
С другой стороны, если вы меняете значение аргумента внутри функции - это просто плохой стиль. Я бы вообще сделал аргументы immutable.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
есть хорошая сложная статья http://habrahabr.ru/company/mailru/blog/257999/
в конце описано как работают ссылки в 5 и как они сделаны в 7

ссылка в 7 - специальный zval типа ссылка, и при обращении ссылка резолвится,
а в 5 ссылка - алиас, наличие которого делает невозможным ленивое копирование при обычном присвоении или при передаче в параметр,
так что при передаче параметра по ссылке или если перед передачей в параметр на переменную была создана ссылка, в 5ке выполняется полное копирование данных в новый zval,
а в 7ке данные лежат в памяти отдельно от zval, и копирования данных нет ни при передаче по ссылке, ни при создании zval для итерации в foreach, ни при обычном присвоении, так что наличие или отсутствие ссылки на массив ничего не меняет
 
Последнее редактирование:

MiksIr

miksir@home:~$
И, кстати, к "какмыэтобудемдебажить"
PHP:
<?php

function foo(&$bar) {
  $bar = 100500;

  debug_print_backtrace();

  throw new Exception();
}

$bar = "string";
foo($bar);
#0 foo(100500) called at [/home/miksir/backtrace.php:12]


PHP Fatal error: Uncaught exception 'Exception' in /home/miksir/backtrace.php:8
Stack trace:
#0 /home/miksir/backtrace.php(12): foo(100500)
#1 {main}
thrown in /home/miksir/backtrace.php on line 8

Жили как-то раньше, не?
 

HORO

Новичок
ничего хорошего в копировании массива нет, любые неявные преобразования это плохо, особенно такие бессмысленные.
и как теперь будет работать array_splice в цикле? Например если мне надо пройтись по массиву и вставить некоторые элементы в определенные(заранее неизвестные) места...
 

hell0w0rd

Продвинутый новичок
ничего хорошего в копировании массива нет, любые неявные преобразования это плохо, особенно такие бессмысленные.
и как теперь будет работать array_splice в цикле? Например если мне надо пройтись по массиву и вставить некоторые элементы в определенные(заранее неизвестные) места...
Никак. В нормальных языках изменение коллекции при ее итерации зарубается на этапе компиляции. В остальных должно быть UB.
 

HORO

Новичок
ээ это смотря в какой памяти коллекция хранится :)
 

HORO

Новичок
Ну если память из кучи берется, то её можно изменять/выделять/удалять в любой момент времени. Ничего не мешает изменять коллецию в момент итерации
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
Смотря какая коллекция. Если какой-нибудь doubly linked list - не проблема, а если fixed array? предлагаешь realloc делать?
 

HORO

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