PHP新特性集合
php8新特性
命名参数
function foo(string $a, string $b, ?string $c = null, ?string $d = null)
{ /* … */ }
你可以通过下面的方式传入参数进行调用
foo(b: 'value b', a: 'value a', d: 'value d',
);
联合类型
php7
class Number {/** @var int|float */private $number;/*** @param float|int $number*/public function __construct($number) {$this->number = $number;}
}
new Number('NaN'); // Ok
php8
class Number {public function __construct(private int|float $number) {}
}
new Number('NaN'); // TypeError
新的 mixed类型
mixed本身是以下类型之一:array
bool
callable
int
float
null
object
resource
string
function bar(): ?mixed {}
nullsafe运算符
//现在可以用新的 nullsafe 运算符链式调用,而不需要条件检查 null。 如果链条中的一个元素失败了,整个链条会中止并认定为 Null。$country = null;
if ($session !== null) {$user = $session->user;if ($user !== null) {$address = $user->getAddress();if ($address !== null) {$country = $address->country;}}
}//简化为一行代码
$country = $session?->user?->getAddress()?->country;
str_contains()、str_starts_with()和str_ends_with()函数
有些人可能会说它早就该有了,但我们终于不必再依赖strpos() 来知道字符串是否包含另一个字符串了。
//判断$s 中是否存在words
$s = 'string with lots of words';
if (str_contains($s, 'words')) { /* … */ }str_starts_with('haystack', 'hay'); // true 判断开头
str_ends_with('haystack', 'stack'); // true 判断结尾
WeakMap类
WeakMap是将对象作为key来访问的map。也就是说,WeakMap中的键是存储另一个对象的引用,一旦另一个对象被删除,该WeakMap的key的引用也会断开。
不使用WeakMap的案例
<?php
// 房子
class House
{public function __construct(public array $rooms = []){}// 添加人public function addPerson(Person $person){$this->rooms[$person->name] = $person;}
}// 人
class Person
{public function __construct(public string $name){}
}$house = new House();
$lucy = new Person('lucy');
$jony = new Person('jony');// 为房子添加人
$house->addPerson($lucy);
$house->addPerson($jony);echo count($house->rooms); // 2人
unset($lucy); // 删除1人
echo count($house->rooms); // 还是2人// 这个人还在
$lucyObj = $house->rooms['lucy'];
echo $lucyObj->name; // lucy
WeakMap的使用
class House
{public WeakMap $rooms;public function __construct(){// 实例化 WeakMap$this->rooms = new WeakMap();}public function addPerson(Person $person){// 注意,这里的键一定是要一个对象$this->rooms[$person] = $person->name;}
}class Person
{public function __construct(public string $name){}
}// 房东
$house = new House();
// 租房的人
$lucy = new Person('lucy');
$jony = new Person('jony');// 租房并给要钥匙
$house->addPerson($lucy);
$house->addPerson($jony);// 查看租房人数
echo count($house->rooms); // 2人
// lucy不租了(删除引用)
unset($lucy);
// 再次查看租房人数
echo count($house->rooms); // 1人$lucyObj = $house->rooms['lucy'];
// 报错,lucy这个人已经走了
print_r($lucyObj);
// 通过调用WeakMap中提供的迭代器方法来查看其他租客信息
foreach ($house->rooms->getIterator() as $k => $v) {
print_r($k);
}
==============php7新特================
标量类型的声明
标量类型声明有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型。
PHP标量包含: 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。
php函数接受多个参数
function getNum(){$arr = func_get_args(); //获取全部print_r(func_get_arg(1)); // 获取第几个参数print_r($arr);
}
getNum(1,"qwer",[1,2,3]);

function sumOfInts(int ...$ints)
{print_r(func_get_args()); // 获取第几个参数
}sumOfInts(1,2,3);

返回值类型声明
/*** ?array 表示必须传入数组或者null,否则报错* : ?array 表示返回必须是数组或者null,否则报错*/
function arraysSum(?array $arrays): ?array
{return $arrays;
}
var_dump(arraysSum([6]));
/*** @param $s* @return string|null* 如果输入参数$s 没有限定的话,输入int类型会转换为string,如果数组array类型会报错*/
function stringTest($s): ?string
{return $s;
}
var_dump(stringTest(5));
/*** @param int|null $a* @param int|null $b* @return int|null 如果返回字符串,则会被转换为int类型*/
function sum(?int $a, ?int $b): ?int{if ($a == null || $b == null) {return null;}return $a + $b;
}var_dump(sum(1,2));
/*** @return void* :void 明确表示该函数没有返回值,可以省略return也可以只写return* 该函数返回null*/
function testReturn(): void
{return ;
}
var_dump(testReturn()); // null
null合并运算符
$a ?? 0 等同于 isset($a) ? $a : 0$a ?: 0 等同于 $a ? $a : 0empty: 判断一个变量是否为空(null、false、00、0、’0′、』这类,都会返回true)isset: 判断一个变量是否设置(值为false、00、0、’0′、』这类,也会返回true)
// 定义之前
print_r($name ?? 'Tom');
// Tomprint_r($name ?: 'Jack');
// Jack
// Undefined variable: name// 定义之后
$name = '';print_r($name ?? 'Tom');
// ''print_r($name ?: 'Jack');
// Jack$a = 0;
$b = 1;var_dump($a ?? $b); // int(0)
var_dump(isset($a) ? $a : $b); // int(0)var_dump($a ?: $b); // int(1)
var_dump($a ? $a : $b); // int(1)
太空船操作符(组合比较符)
太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。 比较的原则是沿用 PHP 的常规比较规则进行的。
// 整数
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1// 浮点数
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
匿名类
现在支持通过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;
$app->setLogger(new class implements Logger {public function log(string $msg) {echo $msg;}
});var_dump($app->getLogger());
?>
namespace 导入的类
// PHP 7 之前的代码
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 some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
整数除法函数 intdiv()
<?php//新加的函数 intdiv() 用来进行 整数的除法运算。
var_dump(intdiv(10, 3)); // int(3) ?>
random_bytes函数
// 一般配合bin2hex()函数使用
// bin2hex()把ASCII字符串转换为十六进制值
echo bin2hex(random_bytes(10));random_bytes() 每次调用都会生成不同内容的二进制字符串,而参数则是二进制的字节长度。直接获取到的二进制数据是乱码格式的,所以一般我们会需要使用 bin2hex() 来将二进制转换成我们可以看懂的十六进制格式字符串。不过由此带来的结果就是我们转换之后的十六进制的字符长度是我们设定的字符长度的 2 倍。这个函数的作用,可以为我们生成安全的用户密码 salt 、 密钥关键字 或者 初始化向量。原错误内容:random_bytes() 每次调用都会生成不同内容的字符串,而参数则是字符长度的随机字符,在这里我们传递的是 5 ,返回了 10 个字符,可以看出这个参数是字符数量,而返回的其实是字节数量,对应一个字符占用两个字节的返回形式。或者我们就直接记住它返回的就是参数的两倍即可。至于这个函数的作用嘛,可以为我们生成安全的用户密码 salt 、 密钥关键字 或者 初始化向量
数组展开运算
$arrayA = [1, 2, 3];$arrayB = [4, 5];$result = [0, ...$arrayA, ...$arrayB, 6 ,7];// [0, 1, 2, 3, 4, 5, 6, 7]
类常量可见性
class Sky8g
{const PUBLIC_CONST_A = 1;public const PUBLIC_CONST_B = 2;protected const PROTECTED_CONST = 3;private const PRIVATE_CONST = 4;
}
多异常捕获处理
<?php
try {// some code
} catch (FirstException | SecondException $e) {// handle first and second exceptions
}
<?php
//创建四个exception的子类,每个子类中分别有一个可以解决异常问题的方法
class wcexception extends exception{function pro(){echo "去公厕上厕所<br>";}
}
class noexception extends exception{function pro(){echo "去公司附近吃早餐<br>";}
}
class gsexception extends exception{function pro(){echo "走普通的公路<br>";}
}
class luexception extends exception{function pro(){echo "换上备胎<br>";}
}
//定义一个类,包含四种方法对应四种行为,用条件判断如果行为有异常则抛出异常
class dm{function gowc($bj){if(!$bj){throw new wcexception("倒霉催的,厕所坏了<br>");}echo "上厕所顺利<br>";}function zc($time){if(!$time){throw new noexception("没时间吃早餐了<br>");}echo "早餐很好吃<br>";}function sgs($xx){if(!$xx){throw new gsexception("下雪高速封路<br>");}echo "上高速很顺利<br>";}function drive($dz){if(!$dz)throw new luexception("车子爆胎了<br>");echo "开车一路顺利<br>";}
}
echo "早上起床!<br>";
try{
//创建一个对象,下面调用四个方法分别对应四种可能导致异常的行为$ob=new dm();
//上厕所$ob->gowc(true);
//吃早餐$ob->zc(true);
//上高速$ob->sgs(false);
//开车$ob->drive(false);
}
//一个try可以对应多个catch
catch(wcexception $e){echo $e->getmessage();$e->pro();
}
catch(noexception $e){echo $e->getmessage();$e->pro();
}
catch(gsexception $e){echo $e->getmessage();$e->pro();
}
//最后一个catch中可以不用exception的子类,这样可以用来捕获漏网之鱼,但不能写出解决方案;
catch(exception $e){echo $e->getmessage();$e->pro();
}
echo "到公司开始工作<br>";
?>
list()现在支持键名
$data = [["id" => 1, "name" => 'Tom'],["id" => 2, "name" => 'Fred'],
];// list() style
list("id" => $id1, "name" => $name1) = $data[0];echo $id1,$name1;//1Tom
支持为负的字符串偏移量
var_dump("abcdef"[-2]);//string (1) "e"
新的对象类型
这种新的对象类型object, 引进了可用于逆变(contravariant)参数输入和协变(covariant)返回任何对象类型。
<?php
function test(object $obj) : object
{return new SplQueue();
}test(new StdClass());
类型属性
//类属性现在支持类型声明。
<?php
class User {public int $id;public string $name;
}
?>
箭头函数
<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);//短闭包函数
array_map(function (User $user) { return $user->id;
}, $users)?>
合并数组新方式
<?php
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
?>
define() 定义常量数组
define('ANIMALS', ['dog','cat','bird'
]);echo ANIMALS[1]; // 输出 "cat
将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');
新增数组函数 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新特性集合
php8新特性命名参数function foo(string $a, string $b, ?string $c null, ?string $d null) { /* … */ }你可以通过下面的方式传入参数进行调用foo(b: value b, a: value a, d: value d, );联合类型php7class Number {/** var int|float */private $number;/*** param f…...

【开发环境配置】--Python3的安装
1-开发环境配置 工欲善其事,必先利其器! 编写和运行程序之前,我们必须先把开发环境配置好。只有配置好了环境并且有了更方便的开发工具,我们才能更加高效地用程序实现相应的功能。然而很多情况下,我们可能在最开始就…...

postman实现接口测试详细教程
各位小伙伴大家好, 今天为大家带来postman实战接口测试详细教程 一、通过接口文档集合抓包分析接口 通过fiddler抓包获取到注册接口URL地址及相关参数数据,并通过接口文档分析接口参数内容及参数说明, 如有必要的依赖条件必须进行梳理, 如token等 Fiddler抓包注册接口请求与…...

使用crontab执行定时任务
本来这个东西是挺简单的,是我脑子一直没转过来弯,我就想看看有多少人跟我一样😏 crontab语法自己去菜鸟教程看看就知道了,没什么难度 需求:每分钟定时执行一个PHP文件或者一个PHP命令 这是需要执行的文件࿰…...

剑指 Offer 56 - II. 数组中数字出现的次数 II
题目 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。 思路 这题是剑指 Offer 56 - I. 数组中数字出现的次数的变体,本题只有一个数num出现一次,其余的均出现三次 三次的话使用异或消无法…...

C语言学习笔记(八): 自定义数据类型
结构体变量 什么是结构体 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体 结构体的成员可以是任何类型的变量,如整数,字符串,浮点数,其他结构体,指针等 struct Student //s…...

Video Speed Controller谷歌视频加速插件——16倍速
文章目录前言最简单的版本一、如果是简单的话 可以Microsoft Edge使用二、简单的版本 火狐的话使用Global Speed插件三、由于视频受限以上的方法行不通 还是谷歌好用前言 主要是网课刷的时候 太慢所以找到了刷视频的方法 由于前几个的权限受限制 所以还是选用了谷歌浏览器的 V…...

VSCode 的下载安装及基本使用
目录 一、VSCode 是什么? 二、VSCode 的下载和安装 2.1 - 下载 2.2 - 安装 2.3 - 安装汉化插件 三、MinGW-w64 的下载安装及配置 3.1 - 介绍 3.2 - 下载 3.3 - 解压安装 3.4 - 环境变量配置 3.5 - 验证配置是否成功 3.6 - 安装 C/C 插件 四、在 VSCode …...

【操作系统】磁盘IO常见性能指标和分析工具实战
1.磁盘读写常见的指标 (1)IOPS(Input/Output Operations per Second) 指每秒能处理的I/O个数,表示块存储处理读写(输出/输入)的能力,单位为次,有顺序IOPS和随机IOPS比如…...
SpringMVC基础
简介 Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面;Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块;使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择…...

低代码开发平台|制造管理-质检管理搭建指南
1、简介1.1、案例简介本文将介绍,如何搭建制造管理-质检管理。1.2、应用场景质检分别包括来料质检、过程质检、成品质检,来料质检在采购物料入库后会自动发起来料质检的流程,质检合格才可提交结束流程;过程检是在生产过程中的质检…...

推荐一个.Ner Core开发的配置中心开源项目
更多开源项目请查看:一个专注推荐.Net开源项目的榜单 当你把单体应用改造为微服务架构,相应的配置文件,也会被分割,被分散到各个节点。这个时候就会产生一个问题,配置信息是分散的、冗余的,变成不好维护管理…...

Vue3+vite4使用mockjs进行模拟开发遇到的坑
Vue3vite4使用mockjs进行模拟开发遇到的坑 最近没那么忙了,就想着自己写一个后台管理系统的小demo。刚好最近把Vue3的文档撸了一遍,正好可以顺便练习一下Vue3ts。 插件 1、mockjs是必不可少的。 2、vite-plugin-mock。由于现在创建Vue3项目默认都使用vit…...
一起Talk Android吧(第四百九十三回:动画知识总结)
文章目录知识回顾经验总结各位看官们大家好,上一回中咱们说的例子是"精减版动画",这一回中咱们说的例子是" 动画知识总结"。闲话休提,言归正转,让我们一起Talk Android吧!知识回顾 看官们,我们在…...

腾讯云企业网盘正式入驻数字工具箱
腾讯技术公益继腾讯电子签等入驻后,上线近半年的腾讯技术公益数字工具箱再次迎来新成员——腾讯云企业网盘,现已正式接受公益机构申请公益权益。腾讯云企业网盘(https://pan.tencent.com)是由腾讯云推出的一款安全、高效、开放的企…...
2.13练习
1、设备树设备树描述硬件信息的一种树形结构,设备树文件在linux内核启动后被内核解析。描述一个硬件设备信息的节点我们叫做设备节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同属性是以链式结构存储2、设备树的文件格式内核顶…...

【iOS】APP IM聊天框架的设计(基于第三方SDK)
【iOS】APP IM聊天框架的设计(基于第三方SDK) 前言 在开发社交聊天类型的APP的时候,IM是必不可少的功能,而且很多公司的IM服务都是接的第三方的,很少用自研的,国内的IM厂商也都很成熟,本文所有…...

centos安装FastDFS,集成到SpringBoot中
前言 本教程采用centos7 实测 安装fastdfs,每一步都存在截图,安装不成功你就我 最关键的是采用springboot 集成 fastdfs,上传保存文件信息 小序 FastDFS是一个开源的分布式文件系统,她对文件进行管理,功能包括&…...

看透react源码之感受react的进化
写在前面 网上有许多关于react源码解读的文章,其中有很多都只是单纯贴源码,罗列变量名。其实大家都知道这个英文怎么读,直译也大概知道意思,但是这个英文在react中起到什么作用,并没有说的很通俗明白。 对于刚刚接触…...

【最优化理论】线性规划
文章目录什么是线性规划(Linear Programming,LP)?线性规划的标准形式非标准形LP模型转化为标准形LP模型基本概念基本解&基矩阵&基变量&非基变量基本可行解&可行基矩阵&非退化的基本可行解&退化的基本可行…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...