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除外。
目录
相关文章
|
2月前
|
SQL 安全 PHP
PHP 自发布以来一直在 Web 开发领域占据重要地位,PHP 8 更是带来了属性、刚性类型等新特性。
【10月更文挑战第1天】PHP 自问世以来,凭借其易用性和灵活性,在 Web 开发领域迅速崛起。从简单的网页脚本语言逐步演进为支持面向对象编程的现代语言,尤其自 PHP 5.3 引入命名空间后,代码组织和维护变得更加高效。PHP 7 的性能优化和 PHP 8 的新特性(如属性和刚性类型)进一步巩固了其地位。框架如 Laravel、Symfony、Yii2 和 CodeIgniter 等简化了开发流程,提高了效率和安全性。
54 2
|
3月前
|
PHP 开发者
PHP 7新特性深度解析与实践应用
【9月更文挑战第17天】本文将深入探讨PHP 7的新特性及其对开发者的实际影响,同时通过实例演示如何有效利用这些特性优化代码和提高性能。我们将从类型声明的增强开始,逐步深入到其他关键改进点,最后通过一个综合案例展示如何将这些新特性应用于日常开发中。
|
15天前
|
缓存 PHP 开发者
PHP 7新特性及其影响
本文主要介绍了PHP 7的新特性以及这些新特性对开发者和项目的影响。文章详细解析了PHP 7的性能提升、类型声明、空合并运算符等新特性,并讨论了如何利用这些新特性来优化代码。同时,文章也探讨了这些新特性可能带来的问题和挑战,如兼容性问题和学习成本等。最后,文章以一个实际的代码示例来展示如何使用PHP 7的新特性来优化代码。
18 1
|
21天前
|
编译器 PHP 开发者
PHP 8新特性解析与实战应用####
随着PHP 8的发布,这一经典编程语言迎来了诸多令人瞩目的新特性和性能优化。本文将深入探讨PHP 8中的几个关键新功能,包括命名参数、JIT编译器、新的字符串处理函数以及错误处理改进等。通过实际代码示例,展示如何在现有项目中有效利用这些新特性来提升代码的可读性、维护性和执行效率。无论你是PHP新手还是经验丰富的开发者,本文都将为你提供实用的技术洞察和最佳实践指导。 ####
27 1
|
1月前
|
PHP 开发者
PHP 7新特性深度解析
【10月更文挑战第40天】随着PHP 7的发布,这个广泛使用的语言带来了许多令人兴奋的新特性和性能改进。本文将深入探讨PHP 7的主要变化,包括类型声明、错误处理机制、性能优化等方面,帮助开发者更好地理解和应用这些新特性。
32 4
|
1月前
|
PHP 开发者
PHP 7新特性深度解析及其最佳实践
【10月更文挑战第31天】本文将深入探讨PHP 7带来的革新,从性能提升到语法改进,再到错误处理机制的变革。我们将通过实际代码示例,展示如何高效利用这些新特性来编写更加健壮和高效的PHP应用。无论你是PHP新手还是资深开发者,这篇文章都将为你打开一扇窗,让你看到PHP 7的强大之处。
|
1月前
|
安全 编译器 PHP
PHP 8新特性解析与实践应用####
————探索PHP 8的创新功能及其在现代Web开发中的实际应用
|
2月前
|
PHP 数据安全/隐私保护 开发者
PHP 7新特性解析与实践
【10月更文挑战第20天】本文将深入浅出地介绍PHP 7的新特性,包括性能提升、语法改进等方面。我们将通过实际代码示例,展示如何利用这些新特性优化现有项目,提高开发效率。无论你是PHP新手还是资深开发者,都能从中获得启发和帮助。
|
2月前
|
安全 编译器 PHP
PHP 7新特性深度解析与实践
【10月更文挑战第7天】在这篇文章中,我们将探索PHP 7带来的新特性和改进,以及如何利用这些新工具来提升你的代码效率。从性能优化到语法简化,再到错误处理的改进,本文将带你深入了解PHP 7的核心变化,并通过实际代码示例展示如何将这些新特性应用到日常开发中。无论你是PHP新手还是资深开发者,这篇文章都将为你提供有价值的见解和技巧。
45 6
|
2月前
|
安全 编译器 API
探索PHP 8的新特性及其对现代Web开发的影响
【10月更文挑战第5天】随着PHP 8的发布,这门历史悠久的脚本语言重获新生。PHP 8引入了联合类型、命名参数、属性、空安全运算符及JIT编译器等一系列新特性,不仅提升了开发者的编程体验,还增强了PHP在现代Web开发领域的竞争力。本文将详细介绍这些新特性及其对Web开发的影响。例如,联合类型允许函数参数接受多种类型,提高代码灵活性;命名参数则使函数调用更加直观易懂;属性可用于装饰类、方法等,提供额外信息;空安全运算符避免了访问未定义属性时的错误;JIT编译器则显著提升了性能。这些改进共同提升了代码质量和开发效率,巩固了PHP在Web开发中的地位。
25 4