Новые возможности

Константные выражения

Теперь можно предоставить скалярное выражение, включающее числовые и строковые литералы и/или константы, когда ранее ожидалось статическое значение, например, в объявлениях констант или значениях аргументов функций по умолчанию.

<?php
const ONE = 1;
const
TWO = ONE * 2;

class
C {
const
THREE = TWO + 1;
const
ONE_THIRD = ONE / self::THREE;
const
SENTENCE = 'Значение константы THREE - '.self::THREE;

public function
f($a = ONE + self::THREE) {
return
$a;
}
}

echo (new
C)->f()."\n";
echo
C::SENTENCE;
?>

Результат выполнения приведённого примера:

4
Значение константы THREE -  3

Также можно определить массив (array) с использованием ключевого слова const:

<?php
const ARR = ['a', 'b'];

echo
ARR[0];
?>

Результат выполнения приведённого примера:

a

Функции с переменным количеством аргументов, используя синтаксис ...

Функции с переменным количеством аргументов теперь можно реализовывать с использованием оператора ... вместо того, чтобы полагаться на func_get_args().

<?php
function f($req, $opt = null, ...$params) {
// $params - массив, содержащий все остальные аргументы.
printf('$req: %d; $opt: %d; количество параметров: %d'."\n",
$req, $opt, count($params));
}

f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>

Результат выполнения приведённого примера:

$req: 1; $opt: 0; количество параметров: 0
$req: 1; $opt: 2; количество параметров: 0
$req: 1; $opt: 2; количество параметров: 1
$req: 1; $opt: 2; количество параметров: 2
$req: 1; $opt: 2; количество параметров: 3

Распаковка аргументов с помощью ...

Массивы и объекты, реализующие интерфейс Traversable, могут быть распакованы в список аргументов при передаче в функцию с помощью оператора ....

<?php
function add($a, $b, $c) {
return
$a + $b + $c;
}

$operators = [2, 3];
echo
add(1, ...$operators);
?>

Результат выполнения приведённого примера:

6

Возведение в степень с помощью **

Добавлен право-ассоциативный оператор **, обозначающий возведение в степень. Также доступен короткий синтаксис **=.

<?php
printf
("2 ** 3 == %d\n", 2 ** 3);
printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);

$a = 2;
$a **= 3;
printf("a == %d\n", $a);
?>

Результат выполнения приведённого примера:

2 ** 3 ==      8
2 ** 3 ** 2 == 512
a ==           8

use function и use const

Оператор use был расширен для поддержки импорта функций и констант в дополнение к классам. Это достигается с помощью конструкций use function и use const, соответственно.

<?php
namespace Name\Space {
const
FOO = 42;
function
f() { echo __FUNCTION__."\n"; }
}

namespace {
use const
Name\Space\FOO;
use function
Name\Space\f;

echo
FOO."\n";
f();
}
?>

Результат выполнения приведённого примера:

42
Name\Space\f

phpdbg

Теперь PHP содержит интерактивный дебаггер, называющийся "phpdbg" и реализованный как модуль SAPI. Подробности смотрите в документации phpdbg.

Кодировка по умолчанию

Добавлен ini-параметр default_charset, в котором можно указать кодировку по умолчанию для использования в функциях htmlentities(), html_entity_decode() и htmlspecialchars(). Обратите внимание, что если (сейчас считается устаревшим) заданы параметры кодировки iconv и mbstring, они будут иметь преимущество перед default_charset для iconv и mbstring.

Значение этой настройки по умолчанию равно UTF-8.

Переиспользование php://input

php://input теперь можно переоткрывать и считывать столько раз, сколько нужно. Это также привело к значительному уменьшению объёма памяти, необходимой для работы с данными POST.

Загрузка больших файлов

Теперь можно загружать файлы размером более 2ГБ.

GMP поддерживает перегрузку операторов

Объекты GMP теперь поддерживают перегрузку операторов и приведение к скалярным типам. Это позволяет использовать GMP в вашем коде более выразительно:

<?php
$a
= gmp_init(42);
$b = gmp_init(17);

if (
version_compare(PHP_VERSION, '5.6', '<')) {
echo
gmp_intval(gmp_add($a, $b)), PHP_EOL;
echo
gmp_intval(gmp_add($a, 17)), PHP_EOL;
echo
gmp_intval(gmp_add(42, $b)), PHP_EOL;
} else {
echo
$a + $b, PHP_EOL;
echo
$a + 17, PHP_EOL;
echo
42 + $b, PHP_EOL;
}
?>

Результат выполнения приведённого примера:

59
59
59

hash_equals() для предотвращения атак по времени при сравнении строк

Была добавлена функция hash_equals() для сравнения двух строк за постоянное время. Это должно помочь избежать атак по времени; например, во время тестирования хеширования паролей функцией crypt() (при условии, что вы не можете использовать password_hash() и password_verify(), которые не подвержены атакам по времени).

<?php
$expected
= crypt('12345', '$2a$07$usesomesillystringforsalt$');
$correct = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$incorrect = crypt('1234', '$2a$07$usesomesillystringforsalt$');

var_dump(hash_equals($expected, $correct));
var_dump(hash_equals($expected, $incorrect));
?>

Результат выполнения приведённого примера:

bool(true)
bool(false)

__debugInfo()

Был добавлен магический метод __debugInfo() для того, чтобы позволить объекту изменять значения свойств, выводимых при использовании var_dump().

<?php
class C {
private
$prop;

public function
__construct($val) {
$this->prop = $val;
}

public function
__debugInfo() {
return [
'propSquared' => $this->prop ** 2,
];
}
}

var_dump(new C(42));
?>

Результат выполнения приведённого примера:

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}

Алгоритм хеширования gost-crypto

Добавлен алгоритм хеширования gost-crypto. Он реализует функцию хеширования GOST, используемую в таблицах CryptoPro S-box, определённых в » RFC 4357, секция 11.2.

Улучшение SSL/TLS

Очень многое было сделано для улучшения поддержки SSL/TLS в PHP 5.6. Включая разрешение проверки пиров по умолчанию, поддержка сверки отпечатков сертификатов, снижение воздействия атаки пересоединения TLS и множества новых опций контекста SSL для более точного контроля над параметрами протокола и проверок при использовании зашифрованных потоков.

Более подробно все эти изменения описаны в разделе этого руководства Изменения OpenSSL в PHP 5.6.x

Поддержка асинхронности pgsql

Модуль pgsql теперь поддерживает асинхронные соединения и запросы, тем самым разрешая неблокирующее взаимодействие с базами данных PostgreSQL. Асинхронные соединения могут быть установлены с помощью константы PGSQL_CONNECT_ASYNC, и новые функции pg_connect_poll(), pg_socket(), pg_consume_input() и pg_flush() могут быть использованы для обработки асинхронных соединений и запросов.

add a note add a note

User Contributed Notes 7 notes

up
163
tr0y
10 years ago
It is also possible ( in 5.6.0alpha ) to typehint the ...-operator

function foo (stdclass ... $inbound) {
   var_dump($inbound);
}

// ok:
foo( (object)['foo' => 'bar'], (object)['bar' => 'foo'] );

// fails:
foo( 1, 2, 3, 4 );
up
36
Anonymous
9 years ago
Remember, that

    ($a ** $b) ** $c === $a ** ($b * $c)

Thats why exponent operator** is RIGHT associative.
up
38
ashnazg at php dot net
9 years ago
Note the order of operations in that exponentiation operator, as it was opposite of what my first expectation was:

<?php
// what I had expected,
// evaluating left to right,
// since no parens were used to guide the order of operations
2 ** 3 ** 2 == 64; // (2 ** 3) ** 2 = 8 ** 2 = 64

// the given example,
// which appears to evaluate right to left
2 ** 3 ** 2 == 512; // 2 ** (3 ** 2) = 2 ** 9 = 512
?>
up
7
ciachn
9 years ago
Having 2 ** 3 ** 2 = 512 is actually that is the exact correct behavior for a right-associative operator just as specified in the "**" documentation.
up
13
gmblar+php at gmail dot com
10 years ago
<?php

function array_zip(...$arrays) {
    return
array_merge(...array_map(NULL, ...$arrays));
}

$a = array(1, 4, 7);
$b = array(2, 5, 8);
$c = array(3, 6, 9);

var_dump(implode(', ', array_zip($a, $b, $c)));

// Output
string(25) "1, 2, 3, 4, 5, 6, 7, 8, 9"
up
-1
stocki dot r at gmail dot com
3 years ago
You can create a self-documented, named argument workaround in PHP 5.6-7 with ... operator:

<?php
htmlspecialchars
($string, ...array_values([
   
'flags'         => ENT_COMPAT | ENT_HTML401,
   
'encoding'      => 'UTF-8',
   
'double_encode' => false,
]))
?>
up
-3
BernieV
4 years ago
The splat operator (...) is documented everywhere with no space after it.
But it seems to work just as well with whitespace between ... and what follows.
My IDE line-wrapped, introducing white-space, immediately after the ...
To Top