Rumah > pembangunan bahagian belakang > PHP7 > 一起看看php7新特性

一起看看php7新特性

coldplay.xixi
Lepaskan: 2023-02-17 16:06:01
ke hadapan
3612 orang telah melayarinya

一起看看php7新特性

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

2、PHP NULL 合并运算符

3、PHP 太空船运算符(组合比较符)

4、PHP 常量数组

5、PHP 匿名类

6、PHP Closure::call()

7、PHP 过滤 unserialize()

8、PHP IntlChar()

9、PHP CSPRNG

10、PHP 7 异常

11、PHP 7 use 语句

12、PHP 7 错误处理

13、PHP intp() 函数

14、PHP 7 Session 选项

15、PHP 7 废弃特性

16、PHP 7 移除的扩展

17、PHP 7 移除的 SAPI

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

  • 标量类型声明

    强制模式

declare(strict_types=1)
  <?php 
// 强制模式 
function sum(int ...$ints) 
{ 
   return array_sum($ints); 
} 
print(sum(2, &#39;3&#39;, 4.1)); 
?>

以上程序执行输出结果为:

9复制代码
Salin selepas log masuk
  • 严格模式

<?php 

declare(strict_types=1); 

function sum(int ...$ints) 
{ 
   return array_sum($ints); 
} 

print(sum(2, &#39;3&#39;, 4.1)); 
?>
以上程序由于采用了严格模式,所以如果参数中出现不适整数的类型会报错,执行输出结果为:

PHP Fatal error:  Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……复制代码
Salin selepas log masuk

PHP NULL 合并运算符

  • 以前的三元运算

  $site = isset($_GET['site']) ? $_GET['site'] : '菜鸟教程';复制代码
Salin selepas log masuk
  • 现在的合并运算符

  $site = $_GET['site'] ?? '菜鸟教程';复制代码
Salin selepas log masuk
  • 以上2种方法是一样的

  • 以下是实例:

    <?php
// 获取 $_GET[&#39;site&#39;] 的值,如果不存在返回 &#39;高压锅&#39;$site = $_GET[&#39;site&#39;] ?? &#39;高压锅&#39;;print($site);print(PHP_EOL); // PHP_EOL 为换行符


// 以上代码等价于$site = isset($_GET[&#39;site&#39;]) ? $_GET[&#39;site&#39;] : &#39;高压锅&#39;;print($site);print(PHP_EOL);
// ?? 链$site = $_GET[&#39;site&#39;] ?? $_POST[&#39;site&#39;] ?? &#39;高压锅&#39;;print($site);
?>复制代码
Salin selepas log masuk

组合比较符,又称太空船运算符

PHP 7 新增加的太空船运算符(组合比较符)用于比较两个表达式 $a 和 $b,如果 $a 小于、等于或大于 $b时,它分别返回-1、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);
?>复制代码
Salin selepas log masuk
    以上结果分别为复制代码
Salin selepas log masuk
0
-1
1

0
-1
1

0
-1
1复制代码
Salin selepas log masuk

PHP 常量数组

  • 以前定义常量数组 只能有 const;

  • 现在定义常量数组可以使用 define();

以下是实例:

// 使用 define 函数来定义数组
define('sites', [   'Google',   'Runoob',   'Taobao']);print(sites[1]);
?>
以上程序执行输出结果为:

Runoob复制代码
Salin selepas log masuk

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("我的第一条日志"); 
        ?>
以上程序执行输出结果为:

我的第一条日志复制代码
Salin selepas log masuk

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复制代码
Salin selepas log masuk

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复制代码
Salin selepas log masuk

注意 以上特性是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() 配合复制代码
Salin selepas log masuk

还有参数类型

配置项默认值可选值
zend.assertions11.生成和执行代码 (开发模式)
0.生成代码,但在执行时跳过它
-1.不生成代码 (生产环境)
assert.exception01.断言失败时抛出,可以抛出异常对象,如果没有提供异常,则抛出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(&#39;zend.assertions&#39;, 0); 

assert(true == false); 
echo &#39;Hi!&#39;; 
?>
以上程序执行输出结果为:
Hi!
将 zend.assertions 设置为 1,assert.exception 设置为 1:
实例
<?php 
ini_set(&#39;zend.assertions&#39;, 1); 
ini_set(&#39;assert.exception&#39;, 1); 

assert(true == false); 
echo &#39;Hi!&#39;; 
?>
以上程序执行输出结果为:
Fatal error: Uncaught AssertionError: assert(true == false) in -:2
Stack trace:#0 -(2): assert(false, &#39;assert(true == ...&#39;)#1 {main}
  thrown in - on line 2复制代码
Salin selepas log masuk

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}; 
?>
Salin selepas log masuk

推荐教程:《php教程

Atas ialah kandungan terperinci 一起看看php7新特性. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan