一、PHP 标量类型与返回值类型声明php
二、PHP NULL 合并运算符html
三、PHP 太空船运算符(组合比较符)数组
四、PHP 常量数组安全
五、PHP 匿名类bash
六、PHP Closure::call()markdown
七、PHP 过滤 unserialize()php7
八、PHP IntlChar()闭包
九、PHP CSPRNGapp
十、PHP 7 异常dom
十一、PHP 7 use 语句
十二、PHP 7 错误处理
1三、PHP intdiv() 函数
1四、PHP 7 Session 选项
1五、PHP 7 废弃特性
1六、PHP 7 移除的扩展
1七、PHP 7 移除的 SAPI
强制模式
declare(strict_types=1)
<?php
// 强制模式
function sum(int ...$ints)
{
return array_sum($ints);
}
print(sum(2, '3', 4.1));
?>
以上程序执行输出结果为:
9
复制代码
严格模式
<?php
declare(strict_types=1);
function sum(int ...$ints)
{
return array_sum($ints);
}
print(sum(2, '3', 4.1));
?>
以上程序因为采用了严格模式,因此若是参数中出现不适整数的类型会报错,执行输出结果为:
PHP Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……
复制代码
之前的三元运算
$site = isset($_GET['site']) ? $_GET['site'] : '菜鸟教程';
复制代码
如今的合并运算符
$site = $_GET['site'] ?? '菜鸟教程';
复制代码
以上2种方法是同样的
如下是实例:
<?php
// 获取 $_GET['site'] 的值,若是不存在返回 '高压锅'
$site = $_GET['site'] ?? '高压锅';
print($site);
print(PHP_EOL); // PHP_EOL 为换行符
// 以上代码等价于
$site = isset($_GET['site']) ? $_GET['site'] : '高压锅';
print($site);
print(PHP_EOL);
// ?? 链
$site = $_GET['site'] ?? $_POST['site'] ?? '高压锅';
print($site);
?>
复制代码
PHP 7 新增长的太空船运算符(组合比较符)用于比较两个表达式 $a 和 $b,若是 $a 小于、等于或大于 $b时,它分别返回-一、0或1。
如下是实例
<?php
// 整型比较
print( 1 <=> 1);print(PHP_EOL);
print( 1 <=> 2);print(PHP_EOL);
print( 2 <=> 1);print(PHP_EOL);
print(PHP_EOL); // PHP_EOL 为换行符
// 浮点型比较
print( 1.5 <=> 1.5);print(PHP_EOL);
print( 1.5 <=> 2.5);print(PHP_EOL);
print( 2.5 <=> 1.5);print(PHP_EOL);
print(PHP_EOL);
// 字符串比较
print( "a" <=> "a");print(PHP_EOL);
print( "a" <=> "b");print(PHP_EOL);
print( "b" <=> "a");print(PHP_EOL);
?>
复制代码
以上结果分别为
复制代码
0
-1
1
0
-1
1
0
-1
1
复制代码
如下是实例:
// 使用 define 函数来定义数组
define('sites', [
'Google',
'Runoob',
'Taobao'
]);
print(sites[1]);
?>
以上程序执行输出结果为:
Runoob
复制代码
<?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;
// 使用 new class 建立匿名类
$app->setLogger(new class implements Logger {
public function log(string $msg) {
print($msg);
}
});
$app->getLogger()->log("个人第一条日志");
?>
以上程序执行输出结果为:
个人第一条日志
复制代码
Closure::call()
有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数。实例
<?php
class A {
private $x = 1;
}
// PHP 7 以前版本定义闭包函数代码
$getXCB = function() {
return $this->x;
};
// 闭包函数绑定到类 A 上
$getX = $getXCB->bindTo(new A, 'A');
echo $getX();
print(PHP_EOL);
// PHP 7+ 代码
$getX = function() {
return $this->x;
};
echo $getX->call(new A);
?>
以上程序执行输出结果为:
1
1
复制代码
unserialize()
提供过滤的特性,能够防止非法数据进行代码注入,提供了更安全的反序列化数据。实例
<?php
class MyClass1 {
public $obj1prop;
}
class MyClass2 {
public $obj2prop;
}
$obj1 = new MyClass1();
$obj1->obj1prop = 1;
$obj2 = new MyClass2();
$obj2->obj2prop = 2;
$serializedObj1 = serialize($obj1);
$serializedObj2 = serialize($obj2);
// 默认行为是接收全部类
// 第二个参数能够忽略
// 若是 allowed_classes 设置为 false, unserialize 会将全部对象转换为 __PHP_Incomplete_Class 对象
$data = unserialize($serializedObj1 , ["allowed_classes" => true]);
// 转换全部对象到 __PHP_Incomplete_Class 对象,除了 MyClass1 和 MyClass2
$data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);
print($data->obj1prop);
print(PHP_EOL);
print($data2->obj2prop);
?>
以上程序执行输出结果为:
1
2
复制代码
注意 以上特性是
unserialize()
里面多了一个参数选择 allowed_classes
CSPRNG(Cryptographically Secure Pseudo-Random Number Generator,伪随机数产生器)。
PHP 7 经过引入几个 CSPRNG 函数提供一种简单的机制来生成密码学上强壮的随机数。
random_bytes() - 加密生存被保护的伪随机字符串。
random_int() - 加密生存被保护的伪随机整数。
综上 相似于原先的 rand()
和 'mt_rand()'; 只不过 如今random_bytes()生成的是随机字符串
assert()
函数。它能在生产环境中实现零成本的断言,而且提供抛出自定义异常及错误的能力。assert()的应用 跟assert_option() 配合
复制代码
还有参数类型
配置项 | 默认值 | 可选值 |
---|---|---|
zend.assertions | 1 | 1.生成和执行代码 (开发模式) 0.生成代码,但在执行时跳过它 -1.不生成代码 (生产环境) |
assert.exception | 0 | 1.断言失败时抛出,能够抛出异常对象,若是没有提供异常,则抛出AssertionError 对象实例。 0 . 使用或生成 Throwable, 仅仅是基于对象生成的警告而不是抛出对象(与 PHP 5 兼容) |
**参数**
assertion
断言。在 PHP 5 中,是一个用于执行的字符串或者用于测试的布尔值。在 PHP 7 中,能够是一个返回任何值的表达式, 它将被执行结果用于指明断言是否成功。
description
若是 assertion 失败了,选项 description 将会包括在失败信息里。
exception
在 PHP 7 中,第二个参数能够是一个 Throwable 对象,而不是一个字符串,若是断言失败且启用了 assert.exception 该对象将被抛出
实例
将 zend.assertions 设置为 0:
实例
<?php
ini_set('zend.assertions', 0);
assert(true == false);
echo 'Hi!';
?>
以上程序执行输出结果为:
Hi!
将 zend.assertions 设置为 1,assert.exception 设置为 1:
实例
<?php
ini_set('zend.assertions', 1);
ini_set('assert.exception', 1);
assert(true == false);
echo 'Hi!';
?>
以上程序执行输出结果为:
Fatal error: Uncaught AssertionError: assert(true == false) in -:2
Stack trace:
#0 -(2): assert(false, 'assert(true == ...')
#1 {main}
thrown in - on line 2
复制代码
// PHP 7 以前版本须要使用屡次 use
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 导入同一个 namespace 的类
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};
?>
复制代码