Объявления скалярных типов
Объявления типов параметров функций в PHP 7 теперь могут быть скалярными типами. В PHP 5 разрешались только имена классов, интерфейсы, array или callable (начиная с PHP 5.4, то есть функции, включая анонимные функции). Теперь также можно использовать string, int, float и bool.
<?php
// 强制模式
function sumOfInts(int ...$ints)
{
return array_sum($ints);
}
var_dump(sumOfInts(2, '3', 4.1));
Приведённый выше пример выведет:
int(9)
Обратите внимание, что упомянутая выше проблема строгого режима также применима здесь: в режиме принудительного приведения (по умолчанию, то есть принудительного преобразования типов) параметры, не соответствующие ожиданиям, всё равно приводятся; в строгом режиме возникает фатальная ошибка TypeError.
Объявления типа возвращаемого значения
PHP 7 добавляет поддержку объявлений типов возвращаемого значения. Подобно объявлениям типов параметров, объявления типов возвращаемого значения задают тип возвращаемого функцией значения. Доступные типы такие же, как и доступные в объявлениях параметров.
<?php
function arraysSum(array ...$arrays): array
{
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}
print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));
Приведённый выше пример выведет:
Array
(
[0] => 6
[1] => 15
[2] => 24
)
Оператор объединения с NULL
Поскольку в повседневном коде часто встречаются случаи совместного использования тернарных выражений и isset(), оператор объединения с NULL возвращает собственное значение переменной, если она существует и не равна NULL; в противном случае он возвращает свой второй операнд.
Пример приведён ниже:
<?php // 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值 $username = $_GET['user'] ?? 'nobody'; // 类似的三元运算符 $username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; ?>
Оператор spaceship (комбинированный оператор сравнения)
Оператор spaceship используется для сравнения двух выражений. Он возвращает -1, 0 или 1, когда $a соответственно больше, равен или меньше $b.
Пример приведён ниже:
<?php // 整型 echo 1 <=> 1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1 // 浮点型 echo 1.5 <=> 1.5; // 0 echo 1.5 <=> 2.5; // -1 echo 2.5 <=> 1.5; // 1 // 字符串 echo "a" <=> "a"; // 0 echo "a" <=> "b"; // -1 echo "b" <=> "a"; // 1 ?>
Константные массивы с использованием define()
Пример приведён ниже:
<?php
define('ANIMALS', [
'dog',
'cat',
'bird'
]);
echo ANIMALS[1]; // 输出 "cat"
?>
Анонимные классы
Теперь поддерживается создание экземпляра анонимного класса с помощью new class. Пример выглядит следующим образом:
<?php
interface Logger {
public function log(string $msg);
}
class Application {
private $logger;
public function getLogger(): Logger {
return $this->logger;
}
public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}
$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});
var_dump($app->getLogger());
?>
Приведённый выше пример выведет:
object(class@anonymous)#2 (0) {
}
Синтаксис экранирования кодовых точек Unicode
Он принимает кодовую точку Unicode в шестнадцатеричной форме и выводит строку в кодировке UTF-8, заключённую в двойные кавычки или heredoc. Принимается любая допустимая кодовая точка, а ведущие нули можно опускать.
echo "\u{aa}";
echo "\u{0000aa}";
echo "\u{9999}";
Приведённый выше пример выведет:
ª ª (same as before but with optional leading 0's) 香
Closure::call()
Closure::call() теперь имеет более высокую производительность, позволяя временно привязать замыкание к объекту и лаконично его вызвать.
<?php
class A {private $x = 1;}
// Pre PHP 7 代码
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
echo $getX();
// PHP 7+ 代码
$getX = function() {return $this->x;};
echo $getX->call(new A);
Приведённый выше пример выведет:
1 1
Фильтрация для unserialize()
Эта возможность призвана обеспечить более безопасный способ распаковки ненадёжных данных. Она предотвращает потенциальное внедрение кода с помощью подхода на основе белого списка.
<?php // 转换对象为 __PHP_Incomplete_Class 对象 $data = unserialize($foo, ["allowed_classes" => false]); // 转换对象为 __PHP_Incomplete_Class 对象,除了 MyClass 和 MyClass2 $data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]); // 默认接受所有类 $data = unserialize($foo, ["allowed_classes" => true]);
IntlChar
Недавно добавленный класс IntlChar призван предоставить больше функциональности ICU. Этот класс определяет множество статических методов для работы с символами Unicode в различных наборах символов.
<?php
printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));
Приведённый выше пример выведет:
10ffff COMMERCIAL AT bool(true)
Чтобы использовать этот класс, сначала установите расширение Intl.
Expectations
Expectations — это обратно совместимый способ улучшить предыдущую функцию assert(). Он делает включение утверждений в производственных средах бесплатным и предоставляет возможность выбрасывать конкретные исключения при неудачных утверждениях.
<?php
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Some error message'));
?>
Приведённый выше пример выведет:
Fatal error: Uncaught CustomError: Some error message
Улучшение use
Классы, функции и константы, импортированные из одного и того же пространства имён, теперь можно импортировать сразу с помощью одного оператора use.
<?php
// PHP 7 之前版本用法
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// PHP 7+ 用法
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
?>
Улучшение Generator
Функциональность Generator была расширена, что позволяет реализовать множество продвинутых возможностей.
<?php
<?php
function gen()
{
yield 1;
yield 2;
yield from gen2();
}
function gen2()
{
yield 3;
yield 4;
}
foreach (gen() as $val)
{
echo $val, PHP_EOL;
}
?>
Приведённый выше пример выведет:
1 2 3 4
Целочисленное деление
Добавлена новая функция целочисленного деления intdiv(). Пример использования:
<?php var_dump(intdiv(10, 3)); ?>
Приведённый выше пример выведет:
int(3)
Дополнительную информацию см.:http://www.example.com/php/php7-new-features.html。