PHP7新特性和变化(2)

简介: PHP7新特性和变化

PHP7.1新特性

可为空(Nullable)类型

参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是null

#php5
function($a = null){
  if($a===null) {
    return null;
  }
  return $a;
}
#php7+
function fun() :?string
{
  return null;
}
function fun1(?$a)
{
  var_dump($a);
}
fun1(null);//null
fun1('1');//1

void 类型

返回值声明为 void 类型的方法要么干脆省去 return 语句。对于 void 来说,NULL不是一个合法的返回值。

function fun() :void
{
  echo "hello world";
}

类常量可见性

class Something
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

iterable 伪类

这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象.

function iterator(iterable $iter)
{
    foreach ($iter as $val) {
        //
    }
}

多异常捕获处理

一个catch语句块现在可以通过**管道字符(|)**来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用

try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
}

list支持键名

$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];
// list() style
list("id" => $id1, "name" => $name1) = $data[0];
var_dump($id1);//1

字符串支持负向

$a= "hello";
$a[-2];//l

将callback 转闭包

Closure新增了一个静态方法,用于将callable快速地 转为一个 Closure 对象。

<?php
class Test
{
    public function exposeFunction()
    {
        return Closure::fromCallable([$this, 'privateFunction']);
    }
    private function privateFunction($param)
    {
        var_dump($param);
    }
}
$privFunc = (new Test)->exposeFunction();
$privFunc('some value');

http2 服务推送

http2服务器推送的支持现在已经被加入到 CURL 扩展

PHP7.1变更

传递参数过少时将抛出错误

过去我们传递参数过少 会产生warningphp7.1开始会抛出error

移除了ext/mcrypt拓展

PHP7.2新特性

增加新的类型object

function test(object $obj) : object
{
    return new SplQueue();
}
test(new StdClass());

通过名称加载扩展

扩展文件不再需要通过文件加载 (Unix下以 .so 为文件扩展名,在Windows下以 .dll 为文件扩展名) 进行指定。可以在 php.ini 配置文件进行启用

; ini file
extension=php-ast
zend_extension=opcache

允许重写抽象方法

当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。

<?php
abstract class A
{
    abstract function test(string $s);
}
abstract class B extends A
{
    // overridden - still maintaining contravariance for parameters and covariance for return
    abstract function test($s) : int;
}

使用Argon2算法生成密码散列

Argon2 已经被加入到密码散列(password hashing) API (这些函数以 password_ 开头), 以下是暴露出来的常量

新增 PDO 字符串扩展类型

当你准备支持多语言字符集,PDO的字符串类型已经扩展支持国际化的字符集。以下是扩展的常量:

  • PDO::PARAM_STR_NATL
  • PDO::PARAM_STR_CHAR
  • PDO::ATTR_DEFAULT_STR_PARAM
$db->quote('über', PDO::PARAM_STR | PDO::PARAM_STR_NATL);

命名分组命名空间支持尾部逗号

use Foo\Bar\{
    Foo,
    Bar,
    Baz,
};

PHP7.2 变更

number_format 返回值

var_dump(number_format(-0.01)); // now outputs string(1) "0" instead of string(2) "-0"

get_class()不再允许null。

var_dump(get_class(null))// warning

count 作用在不是 Countable Types 将发生warning

count(1), // integers are not countable

不带引号的字符串

在之前不带引号的字符串是不存在的全局常量,转化成他们自身的字符串。现在将会产生waring。

var_dump(HEELLO);

__autoload 被废弃

each 被废弃

使用此函数遍历时,比普通的foreach更慢, 并且给新语法的变化带来实现问题。因此它被废弃了。

is_object、gettype修正

is_object 作用在**__PHP_Incomplete_Class**将反回 true

gettype作用在闭包在将正确返回resource

Convert Numeric Keys in Object/Array Casts

把数组转对象的时候,可以访问到整型键的值。

// array to object
$arr = [0 => 1];
$obj = (object)$arr;
var_dump(
    $obj,
    $obj->{'0'}, // now accessible
    $obj->{0} // now accessible
);

PHP 7.3

灵活的heredoc 和nowdoc

php 7.3 之前我们定义一大段的字符串。需要用到heredoc

<?php 
    $a = <<<H
    hello world
H;

结束标记必须在新行的开头。在php7.3 我们可以就不用受那个限制了

<?php
    $a = <<<H
    hello world
    H;

函数后面支持尾逗号

function fn($a,$b,$c)
{
}
fn(1,2,3,)//最后一个参数后面可以加逗号

JSON_THROW_ON_ERROR

php7.3 之前我们解析json的时候,json_decodejson_encode会返回失败 我们会通过json_last_error 获取错误的信息 。在 php7.3 我们可以通过异常来获取

#php 7.3 之前
$res = json_decode($jsonString,true);
if(json_last_error() !== JSON_ERROR_NONE) {
    echo json_last_error_msg();
}
# php 7.3
try{
    json_decode("invalid json", null, 512, JSON_THROW_ON_ERROR);
}catch($e){
}

is_countable 函数

PHP 7.2 中,用 count() 获取对象和数组的数量。如果对象不可数,PHP 会抛出警告⚠️ 。所以需要检查对象或者数组是否可数。 PHP 7.3 提供新的函数 is_countable() 来解决这个问题。

RFC 提供新的函数 is_countable(),对数组类型或者实现了Countable接口的实例的变量返回 true

之前:

if (is_array($foo) || $foo instanceof Countable) {
   // $foo 是可数的
}

之后:

if (is_countable($foo)) {
   // $foo 是可数的
}

新增数组函数 array_key_first(), array_key_last()

$array = ['a'=>'1','b'=>'2'];
#php 7.3之前
$firstKey  = key(reset($array));
# php 7.3
$firstKey = array_key_first($array);//a
$lastKey = array_key_last($array);//b

废除并移除大小写不敏感的常量

你可以同时使用大小写敏感和大小写不敏感的常量。但大小写不敏感的常量会在使用中造成一点麻烦。所以,为了解决这个问题,PHP 7.3 废弃了大小写不敏感的常量。

原先的情况是:

  • 类常量始终为「大小写敏感」。
  • 使用const关键字定义的全局常量始终为「大小写敏感」。注意此处仅仅是常量自身的名称,不包含命名空间名的部分,PHP 的命名空间始终为「大小写不敏感」。
  • 使用define()函数定义的常量默认为「大小写敏感」。
  • 使用define()函数并将第三个参数设为true定义的常量为「大小写不敏感」。

如今 PHP 7.3 提议废弃并移除以下用法:

  • In PHP 7.3: 废弃使用true作为define()的第三个参数。
  • In PHP 7.3: 废弃使用与定义时的大小写不一致的名称,访问大小写不敏感的常量。truefalse以及null除外。
目录
相关文章
|
1月前
|
存储 测试技术 API
PHP 7.4 新特性及性能优化探究
随着互联网和移动应用的不断发展,PHP作为一种流行的服务器端脚本语言,始终保持着其重要性。本文将介绍PHP 7.4的新特性,包括类型属性、预加载、扩展改进等,并深入探讨这些新特性对PHP性能的影响,以及如何优化PHP 7.4代码以提升性能。
|
1月前
|
PHP 调度 开发者
探索PHP新特性:协程编程的崛起
PHP作为一种流行的服务器端脚本语言,近年来不断发展壮大。本文将重点探讨PHP中新兴的技术领域——协程编程,介绍其原理、优势以及在实际项目中的应用场景,帮助读者更好地理解并运用这一技术。
|
24天前
|
测试技术 PHP 开发者
PHP 7.4新特性深度解析
【4月更文挑战第4天】 本文将深入探讨PHP 7.4的新特性,包括预加载,数组解构,扩展的箭头函数等。我们将详细解释这些新特性的作用,以及如何在项目中使用它们来提高代码的效率和可读性。
|
26天前
|
PHP
PHP 7.4的新特性及实践应用
【4月更文挑战第2天】本文主要介绍了PHP 7.4的新特性,并通过实例代码展示了如何在实际项目中应用这些新特性。文章首先简要回顾了PHP的发展历史,然后详细分析了PHP 7.4的新特性,包括预加载、数组解构、扩展的返回类型声明等。接下来,通过实际代码示例,演示了如何在项目中使用这些新特性。最后,总结了PHP 7.4新特性的优势和局限性,并展望了PHP未来的发展趋势。
|
1月前
|
安全 大数据 编译器
深入理解PHP 8.0的新特性及实践应用
【2月更文挑战第30天】随着PHP 8.0的发布,这一流行的服务器端脚本语言带来了许多令人兴奋的新特性和性能改进。本文将深入探讨PHP 8.0的关键新特性,包括JIT编译器、联合类型、名称参数、匹配表达式等,并通过实际代码示例展示如何利用这些新工具来编写更加高效、简洁和健壮的应用程序。无论您是PHP开发者还是对最新技术趋势感兴趣的技术爱好者,本文都将为您提供宝贵的信息和启发。
21 3
|
1月前
|
编译器 PHP 开发者
PHP 8 新特性解析:提升性能与安全性
随着技术的不断进步,PHP 8作为一种流行的服务器端脚本语言,在性能和安全性方面有了许多值得关注的新特性。本文将深入探讨PHP 8的一些重要更新,包括Just In Time编译器、Union Types、Named Arguments等,帮助开发者更好地利用这些新功能提升应用程序的性能和安全性。
|
4月前
|
人工智能 安全 PHP
PHP特性之CTF中常见的PHP绕过
PHP特性之CTF中常见的PHP绕过
67 1
|
9月前
|
开发框架 安全 .NET
PHP7新特性和变化(1)
PHP7新特性和变化
65 0
|
算法 Java 编译器
如何使用PHP7的新特性提高性能?底层原理是什么?
如何使用PHP7的新特性提高性能?底层原理是什么?
|
存储 PHP
PHP的常量特性有哪些?底层原理是什么?
PHP的常量特性有哪些?底层原理是什么?