PHP8所有新特性

article/2025/9/14 22:17:09

PHP 8 正式版即将发布,是时候来看看 PHP 8 即将推出的新特性了

首先来安装PHP8

下载地址

https://www.php.net/downloads

在这里插入图片描述

本地编译安装 PHP 8 RC2 版本(MAC操作系统)
# 0、下载解压源码
wget https://downloads.php.net/~pollita/php-8.0.0RC2.tar.gz
tar zxvf php-8.0.0RC2.tar.gz
cd php-8.0.0RC2# 1、生成 configure 文件
./buildconf --force# 2、配置构建流程(最小化安装)
./configure --prefix=/usr/local/php8 \
--with-config-file-path=/usr/local/php8 \
--enable-cli \
--without-iconv# 3、构建 && 安装
make && sudo make install# 4、拷贝配置文件
sudo cp php.ini-development /usr/local/php8/php.ini
验证是否安装成功命令
/usr/local/php8/bin/php -v

利用别名来简化命令:

alias php8="/usr/local/php8/bin/php"

之后上述命令可简化为:

php8 -v

下面来总结下新特性

  • 新增对联合类型的支持
    联合类型允许一个变量拥有多个类型的值,而不是一个(参考 C 语言的联合类型很好理解)。
    考虑到 PHP 动态语言类型的特性,现在很多情况下,联合类型都是很有用的。联合类型是两个或者多个类型的集合,表示可以使用其中任何一个类型。
public function foo(Foo|Bar $input): int|float;

请注意,联合类型中不包含 void,因为 void 表示的含义是 “根本没有返回值”。 另外,可以使用 |null 或者现有的 ? 表示法来表示包含 nullable 的联合体 :

public function foo(Foo|null $foo): void;public function bar(?Bar $bar): void;
  • 新增 WeakMap (弱映射)特性
    WeakMap 允许你创建对象到任意值的映射(类似 SplObjectStorage),同时也不会阻止作为键的对象被垃圾回收。如果某个对象键被垃圾回收,对应键值对将从集合中移除。

    这一新特性非常有用,因为这样一来,开发者就不必担心代码存在内存泄露了。大多数 PHP 开发者可能对此并不关心,但是当你编写长时间运行的进程时一定要提防这个问题,比如使用 ReactPHP 进行事件驱动编程时:有了 WeakMap 后,引用的对象会在失效时自动被垃圾回收。

    如果你在数组中做同样的事情,则仍然会持有该对象的引用,从而导致内存泄露。

下面是弱映射基本的例子,RFC :

class FooBar {private WeakMap $cache;public function getSomethingWithCaching(object $obj) {return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);}// ...
}
  • 新增 ValueError 异常
    PHP 8 引入了新的名为 ValueError 的内置异常类,它继承自 Exception 基类。每次当你传递值到函数时,如果是一个无效类型,则会抛出该异常,在 PHP 8 之前,这样的操作会导致警告。
  • 重写方法时允许可变参数
    当我们在子类重写父类方法时,任何数量的参数现在都可以被替换成可变参数,只要对应参数类型是兼容的即可:
<?php
class A {public function method(int $many, string $parameters, $here) {}
}
class B extends A {public function method(...$everything) {}
}
  • 新增 static 返回类型
    尽管已经可以返回 self,但是 static 直到 PHP 8 才是有效的返回类型 。考虑到 PHP 具有动态类型的性质,此功能对于许多开发人员将非常有用。
class Foo
{public function test(): static{return new static();}
}
  • 允许对对象使用 ::class
    PHP 8 中可以使用 o b j e c t : : c l a s s 获 取 对 象 的 类 名 , 其 返 回 结 果 和 g e t c l a s s ( object::class 获取对象的类名,其返回结果和 get_class( object::classgetclass(object) 一样:
$foo = new Foo();var_dump($foo::class);
  • 变量语法调整
    new 和 instanceof 关键字现在可以被用于任意表达式:
class Foo {}
class Bar {}$names = ['Foo', 'Bar'];
$class = new ($names[array_rand($names)]);var_dump($class);
  • 新增 Stringable 接口
    Stringable 接口可用于键入提示任何字符串或实现__ toString() 的内容。此外,每当一个类实现__ toString() 时,即被视作自动实现了 Stringable 接口,而无需手动实现。
class Foo {public function __toString() {return 'I am a class';}
}$obj = new Foo;
var_dump($obj instanceof Stringable);
  • Trait 现在可以定义抽象私有方法
trait MyTrait {abstract private function neededByTheTrait(): string;public function doSomething() {return strlen($this->neededByTheTrait());}
}class TraitUser {use MyTrait;// 支持该语法private function neededByTheTrait(): string { }// 不支持该语法 (错误的返回类型)// private function neededByTheTrait(): stdClass { }// 支持该语法 (非静态方法变成了静态方法)// private static function neededByTheTrait(): string { }
}
  • throw 现在可以被用作表达式
// This was previously not possible since arrow functions only accept a single expression while throw was a statement.
$callable = fn() => throw new Exception();// $value is non-nullable.
$value = $nullableValue ?? throw new InvalidArgumentException();// $value is truthy.
$value = $falsableValue ?: throw new InvalidArgumentException();// $value is only set if the array is not empty.
$value = !empty($array)? reset($array): throw new InvalidArgumentException();
  • 参数列表中允许出现可选的尾部逗号
    和数组中的尾部逗号类似,现在也可以在参数列表中定义一个尾部逗号:
function method_with_many_arguments($a,$b,$c,$d,
) {var_dump("这是个有效语法");
}method_with_many_arguments(1,2,3,4,
);
  • 捕获异常而不存储到变量
    现在可以编写 catch (Exception) 代码来捕获异常而不必将其存储到一个变量中:
$nullableValue = null;try {$value = $nullableValue ?? throw new \InvalidArgumentException();
} catch (\InvalidArgumentException) {var_dump("Something went wrong");
}
  • 新增对 mixed 类型的支持
    PHP 8 引入了新的名为 mixed 的类型,该类型等价于
arrayboolcallableintfloatnullobjectresourcestring

请注意,mixed 不仅仅可以用来作为返回类型,还可以用作参数和属性类型。
另外,还需要注意,因为 mixed 类型已经包括了 null,因此 mixed 类型不可为空。下面的代码会触发致命错误:

// 致命错误:混合类型不能为空,null已经是混合类型的一部分。
function bar(): ?mixed {}
  • 新增对注解的支持
    PHP 8 的注解实际上包含了多个 RFC:
    https://wiki.php.net/rfc/attributes_v2
    https://wiki.php.net/rfc/attribute_amendments
    https://wiki.php.net/rfc/shorter_attribute_syntax
    https://wiki.php.net/rfc/shorter_attribute_syntax_change
    注解绝对是 PHP 8 引入的最大新特性之一,一开始理解起来可能有点困难(不过有 Java 基础的话会很简单)。简而言之,注解允许你添加元数据到 PHP 函数、参数、类等,这些元数据随后可以通过可编程方式获取,在 PHP 7 或者更低版本中实现类似功能需要解析代码注释块,而通过注解可以直接访问深度集成到 PHP 自身的这些信息。
    我们来编写一段示例代码方便你理解,假设你想要允许开发者添加中间件到控制器类/方法,使用注解可以这么做:
// 首先,我们需要定义注解,注解本身只是一个原生的 PHP 类,并且自身被打上了注解的注释#[Attribute]
class ApplyMiddleware
{public array $middlware = [];public function __construct(...$middleware){$this->middleware = $middleware;}
}// 下面的语法会添加上述注解到 MyController 类,并且传入 auth 作为参数#[ApplyMiddleware('auth')]
class MyController
{public function index(){}
}// 然后我们就可以在类中使用反射获取所有的 ApplyMiddleware 注解并读取给定的中间件参数$reflectionClass = new ReflectionClass(MyController::class);$attributes = $reflectionClass->getAttributes(ApplyMiddleware::class);foreach ($attributes as $attribute) {$middlewareAttribute = $attribute->newInstance();var_dump($middlewareAttribute->middleware);
}
  • 新增构造函数属性提示支持
    这个新特性只是一个语法简写而言,可以将属性声明和构造函数属性初始化合并到一起:
class Test {public function __construct(public int $id,public string $name,) {}
}$user = new Test(1, 'Marcel');
  • 新增 match 表达式支持
    match 表达式和 switch 分支语句类似,但是语义上更加安全并且可以直接返回值:
echo match (1) {0 => 'a',1 => 'b',2 => 'c',
};
  • 新增对空安全运算符 ?-> 的支持
    当该运算符的左侧评估为 null 时,整个代码链路的执行将会被终止并整体评估为 null。如果不为 null 的话,则和普通的 -> 运算符功能一致:
class User {public function getAddress() {}
}$user = new User();$country = $user?->getAddress()?->country?->iso_code;var_dump($country);
  • 新增对命名参数的支持
    命名参数允许基于参数名称传递参数到函数,而不是参数所在的位置,这样一来,函数参数就可以自解释并且与顺序无关,并且允许跳过默认值:
array_fill(start_index: 0, num: 100, value: 50);

http://chatgpt.dhexx.cn/article/pW5Fauq0.shtml

相关文章

PHP8新特性解读

本文主要内容为解读PHP8.0的主要新特性 解读PHP8特性 前言一、给小皮面板下载PHP8二、部分下载PHP8会出现502解决方案三、介绍特性1. 联合类型2. 匹配表达式3. null安全运算符4. 构造函数属性提升5. 注解6. 命名参数 四、总结 前言 PHP8在2020年11月26日正式发布&#xff0c;又…

PHP 7 新特性

转载自&#xff1a; https://zhuanlan.zhihu.com/p/27694633 https://zhuanlan.zhihu.com/p/27847880 https://zhuanlan.zhihu.com/p/29478077 https://goghcrow.gitbooks.io/php7/content/xin-te-xing.html PHP 7 之前的类型提示 PHP 5.0 首次提出函数参数&#xff08…

php7 新特性整理

PHP7 已经出来1年了&#xff0c;PHP7.1也即将和大家见面&#xff0c;这么多好的特性&#xff0c;好的方法&#xff0c;为什么不使用呢&#xff0c;也希望PHP越来越好。 在这里整理 PHP 5.1 &#xff0c;PHP5.2,PHP5.3,PHP5.4,PHP5.5,PHP5.6 ,PHP7,PHP7.1 所有新特性&#xff0…

PHP 7 新特性 - 收集

前言 最好的语言发布了新的版本&#xff0c;一个划时代的大版本&#xff1a;PHP7。 PHP7修复了大量BUG&#xff0c;新增了功能和语法糖。这些改动涉及到了核心包、GD库、PDO、ZIP、ZLIB等熟悉和不熟悉的核心功能与扩展包。 PHP7移除了已经被废弃的函数&#xff0c;如mysql_系…

PHP7新特性总结

前言 本文是一篇讲座听后&#xff0b;后续研究的总结。 话说当年追时髦&#xff0c;php7一出就给电脑立马装上了&#xff0c;php5和php7共存&#xff0c;也是立马写了个超级耗时间的循环脚本测了一番&#xff0c;确实php7给力很多&#xff0c;然后也是注意了一些新增的特性与一…

搭建图片加密平台,扫码支付后简单获取密码

搭建图片加密平台&#xff0c;扫码支付后简单获取密码 很多人问我&#xff0c;互联网上到底做什么项目是可以赚到钱的&#xff1f;没有基础&#xff0c;不懂技术&#xff0c;不会推广&#xff0c;所以有没有简单一点的&#xff0c;一操作就能上手就能赚钱的&#xff1f;我可以…

java中Base64图片加密解密保存

工具类中的图片解密的代码 /*** base64字符串转图片* param imgStr 图片的base64* param path 将要生成的地址* return*/ public static String generateImage(String imgStr, String path) {//如果图像数据为空 if (imgStr null) {return null;}BASE64Decoder decoder new…

PC微信机器人之实战分析微信图片加密解密

今天主要讨论下微信图片的加密和解密&#xff0c;我们都知道微信接收的图片是加密形式的需要解密&#xff0c;但是这个加密大家都知道是异或。但是怎么异或&#xff0c;跟谁异或呢&#xff1f;这次就是围绕这个来讲的&#xff0c;我们手动计算异或的值&#xff0c;才能彻底明白…

混沌加密算法python_基于混沌Logistic加密算法的图片加密与还原

摘要 一种基于混沌Logistic加密算法的图片加密与还原的方法,并利用Lena图和Baboon图来验证这种加密算法的加密效果。为了能够体现该算法在图片信息加密的效果,本文还采用了普通行列置乱加密算法和像素点的RGB的值的缩放算法这两种算法对相同的图片的图片进行处理,利用matlab…

关于身份证图片加密安全技术

前言 现在的图片都是上传到c d n或者其它第三方服务器上&#xff0c;通过一个url进行访问&#xff0c;非常的方便&#xff0c;方便的同时也带来了另外一个问题&#xff0c;隐私安全问题&#xff0c;比如&#xff1a;好莱坞隐私照片泄漏。 如何保证图片安全 如果发生客户隐私…

blob图片路径加密

目录 一、代码二、效果演示 一、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>blob图片路径加…

Cocos图片加密与解密

如果cocos项目没有对资源进行加密处理,发布出来的APK一旦被人解包&#xff0c;则所有图片资源都会暴露出来,为了避免图片资源被人恶意使用&#xff0c;所以我准备给自己项目中使用到的图片进行简单加密&#xff0c;这样可以防住一部分解包伸手党。 我们这里采用最常见的异或加…

(在线)实时图片加密

目录 1 功能介绍 2 操作说明 2.1 图片加密 2.1 图片解密 1 功能介绍 图片加密http://eastsun.xyz/sudoku/html/encryptPic.html 该网站主要用于对图片进行在线实时加密,解密 用户可以自定义加密后生成的"文字图片"内容,同时这些文字图片也可以是图片解密的提示信…

python简单的图片加密

欢迎加入我们卧虎藏龙的python讨论qq群&#xff1a;729683466 ●导 语 ● 总有些东西是你不希望别人看到的 比如 你暗恋的女神的照片 要是被别人发现了 那可就尴尬了 所以 来学一学用python加密图片吧&#xff01; 代码及相关资源获取 1&#xff1a;关注“python趣味爱好者”公…

java 图片加密

首先&#xff0c;了解下异或操作 ^ &#xff0c;对一个数进行两次异或操作得到原数值。 public class IOTest {public static void main(String[] args) {int i 3;System.out.println(i^123);//120System.out.println(i^123^123);//3}} 将一张图片进行拷贝&#xff0c;对其进…

用JS实现:图片压缩、图片加密

本文将用JavaScript实现两个颇有技术含量的功能&#xff1a;图片压缩、图片加密。 最终效果&#xff1a;可实现将任意图片加密、压缩&#xff0c;并保存到一个独立的html页面中&#xff0c;输入正确的密码&#xff0c;才能看到原图。 第一步、压缩图片 技术原理 将图片读入c…

python图片水印加密的几种处理方式

常见的图片加密方法包括加密算法、水印、隐藏、压缩等。下面简要介绍一些常见的图片加密方法&#xff1a; 加密算法 加密算法是一种基于数学运算的加密方式&#xff0c;可对图片进行加密处理&#xff0c;使得未经过解密操作的情况下难以被直接读取或显示。常见的加密算法包括对…

去除水印-Teorex Inpaint 序列号

Teorex Inpaint 正版序列号 效果很好&#xff01; 如图所示 序列号在下面&#xff1b; 上面就是 正版的效果&#xff1b; 所以 大家好评 我心领了 记得关注&#xff01; 好福利一堆呢&#xff01; 回复“水印” 知识星球也要加入哦&#xff01; 加粗样式 加入的好朋友…

Inpaint 5.2安装说明

##一&#xff0e;软件简介&#xff1a; Inpaint 是一款可以从图片上去除不必要的物体&#xff0c;让您轻松摆脱照片上的水印、划痕、污渍、标志等瑕疵的实用型软件&#xff1b;简单说来&#xff0c;Inpaint 就是一款强大实用的图片去水印软件&#xff0c;您的图片中不想要的部分…

图片去水印工具:Inpaint 7.2中文专业破解版下载及使用方法

下载地址&#xff1a; 点我 Inpaint 是一款可以从图片上去除不必要的物体&#xff0c;让您轻松摆脱照片上的水印、划痕、污渍、标志等瑕疵的实用型软件&#xff1b;简单说来&#xff0c;Inpaint 就是一款强大实用的图片去水印软件&#xff0c;您的图片中不想要的部分&#xff0…