php7新特性

这是一个标题


随着php7的推出多了不少新特性,接下来我带你们了解下:

H1

H2

H3

一、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

  • 这里面是列表
  • 这里面是列表
  • 这里面是列表

PHP 标量类型与返回值类型声明

  • 标量类型声明

    强制模式

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……
复制代码

PHP NULL 合并运算符

  • 之前的三元运算

    $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
复制代码

PHP 常量数组

  • 之前定义常量数组 只能有 const;
  • 如今定义常量数组可使用 define();

如下是实例:

// 使用 define 函数来定义数组
define('sites', [
   'Google',
   'Runoob',
   'Taobao'
]);

print(sites[1]);
?>
以上程序执行输出结果为:

Runoob
复制代码

PHP 匿名类

  • PHP 7 支持经过 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; 
        // 使用 new class 建立匿名类 
        $app->setLogger(new class implements Logger { 
           public function log(string $msg) { 
              print($msg); 
           } 
        }); 

        $app->getLogger()->log("个人第一条日志"); 
        ?>
以上程序执行输出结果为:

个人第一条日志
复制代码

php Closure::call()

  • PHP 7 的 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
复制代码

PHP 过滤 unserialize()

  • PHP 7 增长了能够为 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

PHP CSPRNG 伪随机数生成器

  • CSPRNG(Cryptographically Secure Pseudo-Random Number Generator,伪随机数产生器)。

  • PHP 7 经过引入几个 CSPRNG 函数提供一种简单的机制来生成密码学上强壮的随机数。

    random_bytes() - 加密生存被保护的伪随机字符串。

    random_int() - 加密生存被保护的伪随机整数。

  • 综上 相似于原先的 rand() 和 'mt_rand()'; 只不过 如今random_bytes()生成的是随机字符串

php7 异常

  • PHP 7 异经常使用于向下兼容及加强旧的assert()函数。它能在生产环境中实现零成本的断言,而且提供抛出自定义异常及错误的能力。
  • 老版本的API出于兼容目的将继续被维护。
  • assert()如今是一个语言结构,它容许第一个参数是一个表达式,而不只仅是一个待计算的 string或一个待测试的boolean。
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 语句

  • PHP 7 可使用一个 use 从同一个 namespace 中导入类、函数和常量:
// 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}; 
?>
复制代码

如下还有几个特性 不一一注释 本文主要是用来 加深本身对php7的印象 以及对markdown的熟练使用

本文来源于 www.runoob.com/php/php7-ne…