php5.6~7.0
标量类型声明
类型声明允许函数在调用时要求参数为特定类型。 如果给出的值类型不对,那么将会产生一个错误: 在PHP 5中,这将是一个可恢复的致命错误,而在PHP 7中将会抛出一个 TypeError异常。为了指定一个类型声明,类型应该加到参数名前。这个声明可以通过将参数的默认值设为
NULL
来实现允许传递NULL
。
PHP7增加了以下几种类型声明
Type | Description | Minimum PHP version |
---|---|---|
bool | bool类型 | PHP 7.0.0 |
float | float类型 | PHP 7.0.0 |
int | int类型 | PHP 7.0.0 |
string | string类型 | PHP 7.0.0 |
iterable | iterable类型 | PHP 7.1.0 |
object | object类型 | PHP 7.2.0 |
返回值类型声明
PHP 7 增加了对返回值类型声明的支持。 就如 [类型声明]一样, 返回值类型声明将指定该函数返回值的类型。同样,返回值类型声明也与 [有效类型] 中可用的参数类型声明一致。
[严格类型] 也会影响返回值类型声明。在默认的弱模式中,如果返回值与返回值的类型不一致,则会被强制转换为返回值声明的类型。在强模式中,返回值的类型必须正确,否则将会抛出一个 TypeError异常.
//严格类型声明
declare(strict_types=1);
function sum($a, $b): float {
return $a + $b;
}
null合并运算符
由于日常使用中存在大量同时使用三元表达式和 [isset()]的情况, 我们添加了null合并运算符 (_??_) 这个语法糖。如果变量存在且值不为
NULL
, 它就会返回自身的值,否则返回它的第二个操作数。
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
太空船操作符(组合比较符)
太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。 比较的原则是沿用 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() 定义常量数组
Array 类型的常量现在可以通过 define() 来定义。在 PHP5.6 中仅能通过 const 定义。
tips:
和使用 define() 来定义常量相反的是,使用 const 关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if 语句之内用 const 来定义常量。
define('ANIMALS', [ 'dog', 'cat', 'bird'
]);
echo ANIMALS[1]; // 输出 "cat"
匿名类
现在支持通过_new class_ 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。
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) {
}
Closure::call()
Closure::call() 现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它。
class A {private $x = 1;}
// PHP 7 之前版本的代码
$getXCB = function() {return $this->x;};
$getX = $getXCB\->bindTo(new A, 'A'); // 中间层闭包
echo $getX();
// PHP 7+ 及更高版本的代码
$getX = function() {return $this->x;};
echo $getX->call(new A);
1
1
预期
预期是向后兼用并增强之前的 assert() 的方法。 它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。
老版本的API出于兼容目的将继续被维护,assert()现在是一个语言结构,它允许第一个参数是一个表达式,而不仅仅是一个待计算的 string或一个待测试的boolean。
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Some error message'));
Fatal error: Uncaught CustomError: Some error message
Group use declarations
从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了。
// 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};
会话选项
session_start() 可以接受一个 array 作为参数, 用来覆盖 php.ini 文件中设置的 会话配置选项。
在调用 session_start() 的时候, 传入的选项参数中也支持 session.lazy_write 行为, 默认情况下这个配置项是打开的。它的作用是控制 PHP 只有在会话中的数据发生变化的时候才 写入会话存储文件,如果会话中的数据没有发生改变,那么 PHP 会在读取完会话数据之后, 立即关闭会话存储文件,不做任何修改,可以通过设置 read_and_close 来实现。
例如,下列代码设置 session.cache_limiter 为 _private_,并且在读取完毕会话数据之后马上关闭会话存储文件。
session_start([ 'cache_limiter'=> 'private', 'read_and_close' => true,
]);
preg_replace_callback_array()
在 PHP 7 之前,当使用 preg_replace_callback() 函数的时候, 由于针对每个正则表达式都要执行回调函数,可能导致过多的分支代码。 而使用新加的 preg_replace_callback_array() 函数, 可以使得代码更加简洁。
现在,可以使用一个关联数组来对每个正则表达式注册回调函数, 正则表达式本身作为关联数组的键, 而对应的回调函数就是关联数组的值。
新加入两个跨平台的函数: random_bytes() 和 random_int() 用来产生高安全级别的随机字符串和随机整数。
可以使用 list() 函数来展开实现了 ArrayAccess 接口的对象
允许在克隆表达式上访问对象成员,例如: _(clone $foo)->bar()_。
持续更新。。。。