ScotlandPHP

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

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

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

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

class 
{
    const 
THREE TWO 1;
    const 
ONE_THIRD ONE self::THREE;
    const 
SENTENCE 'The value of THREE is '.self::THREE;

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

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

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

4
The value of THREE is 3

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

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

echo 
ARR[0];
?>

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

a

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

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

<?php
function f($req$opt null, ...$params) {
    
// $params is an array containing the remaining arguments.
    
printf('$req: %d; $opt: %d; number of params: %d'."\n",
           
$req$optcount($params));
}

f(1);
f(12);
f(123);
f(1234);
f(12345);
?>

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

$req: 1; $opt: 0; number of params: 0
$req: 1; $opt: 2; number of params: 0
$req: 1; $opt: 2; number of params: 1
$req: 1; $opt: 2; number of params: 2
$req: 1; $opt: 2; number of params: 3

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

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

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

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

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

6

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

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

<?php
printf
("2 ** 3 ==      %d\n"** 3);
printf("2 ** 3 ** 2 == %d\n"** ** 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($a17)), PHP_EOL;
    echo 
gmp_intval(gmp_add(42$b)), PHP_EOL;
} else {
    echo 
$a $bPHP_EOL;
    echo 
$a 17PHP_EOL;
    echo 
42 $bPHP_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 {
    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 6 notes

up
160
tr0y
3 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
34
Anonymous
3 years ago
Remember, that

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

Thats why exponent operator** is RIGHT associative.
up
35
ashnazg at php dot net
3 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
10
ciachn
3 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
11
gmblar+php at gmail dot com
3 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
0
hushuilong at g-mail dot com
7 months ago
Attention:
<?php
   
// return $instance->$method(...$args);
   
class Abc{
        protected function
prefix($parameters) {
            echo
"xxxxxxxxxxxxxxxx\n";
           
var_dump($parameters);
        }

        public function
__call($method, $args) {
            echo
"****************\n";
           
var_dump($method, $args);
           
// debug_zval_dump( $args );
       
}
    }

   
$instance = new Abc;

   
$args = ['api'];

   
$instance->prefix(...$args);
    echo
'phpversion: ', phpversion(), "\n";
?>
==========================
output on 5.6.5:
****************
string(6) "prefix"
array(0) {
}
phpversion: 5.6.5

==========================
output on other version not 5.6.5 :
****************
string(6) "prefix"
array(1) {
  [0]=>
  string(3) "api"
}
phpversion: 5.6.24-1+b1
To Top