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模型基本概念基本解&基矩阵&基变量&非基变量基本可行解&可行基矩阵&非退化的基本可行解&退化的基本可行…...
数据库测试的认知和分类
数据库测试的认知和分类 目录:导读 系统测试 集成测试 单元测试 功能测试 数据库性能 性能优化分4部分 安全测试 现在的软件系统,尤其是业务应用系统,后台都连接着一个数据库。数据库中存储了大量的数据,数据库的设计是否…...
MQ中间件概念一览
一、概述 1. 大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力 2. 消息服务中两个重要概念: 消息代理(message broker)和目的地(destination) 当消息发送者发送消息以后,将由…...
爱尔兰公司注册要求及条件
简介: 爱尔兰是一个高度发达的资本主义国家,也是欧盟、经济合作与发展组织、世界贸易组织和联合国的成员国。并且也是世界经济发展速度快的国家之一,因经济发达赢得了“欧洲小虎”的美誉。总体来看,爱经济发展势头趋稳,…...
Java中如何打印对象内存地址?
先看一个简单的程序,一般我们打印对象,大部分是下面的情况,可能会重写下toString()方法,这个另说 Frolan frolan new Frolan(); System.out.println(frolan);// 输出结果 com.test.admin.entity.Frolan2b80d80f这个结果其实是调…...
CF1707E Replace
题目描述 给定一个长为 nnn 的序列 a1,…,ana_1,\ldots,a_na1,…,an,其中对于任意的 iii 满足 1≤ai≤n1 \leq a_i \leq n1≤ai≤n。 定义一个二元组函数如下: f((l,r))(min{al,…,ar},max{al,…,ar})(l≤r)f((l,r))(\min\{a_l,\ldots,a_r\}…...
【Hello Linux】Linux工具介绍 (make/makefile git)
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的常用工具make/makefile git Linux项目自动化构建工具 – make/Makefile 背景 会不会写Makefile 从侧面说明了一个人是否具…...
享元模式flyweight
享元模式属于结构型模式。享元模式是池技术的重要实现方式,它可以减少重复对象的创建,使用缓存来共享对象,从而降低内存的使用。细粒度的对象其状态可以分为两种:内部状态和外部状态。应用场景系统存在大量相似或相同的对象。外部…...
Pulsar
一、简介Apache Pulsar是Apache软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、…...
项目介绍 + 定长内存池设计及实现
你好,我是安然无虞。 文章目录项目介绍当前项目做的是什么?技术栈内存池是什么?池化技术内存池内存池主要解决的问题malloc定长内存池学习目的定长内存池设计项目介绍 当前项目做的是什么? 这个项目是实现一个高并发的内存池, 它的原型是 Google 的一个开源项…...
Linux--线程安全的单例模式--自旋锁--0211
1. 线程安全的单例模式 1.1 什么是单例模式 某些类, 只应该具有一个对象(实例), 就称之为单例. 1.1.1 懒汉方式实现单例模式 以上篇博文的线程池为例 Liunx--线程池的实现--0208 09_Gosolo!的博客-CSDN博客 实现懒汉模式首先要先将构造函数私有化,…...
专门做网站制作的公司/广告seo是什么意思
Android的应用组件 应用组件是 Android 应用的基本构建基块。 共有四种不同的应用组件类型。每种类型都服务于不同的目的,并且具有定义组件的创建和销毁方式的不同生命周期。 活动Activity服务Service广播接收器(Broadcast Receiver)内容提供程序(Content Provide…...
扮家家室内设计平台/seo关键词优化推广价格
在我东,下下来一个项目总会出现启动不了的问题,这些问题往往在编译的时候发现不了,当你的服务器启动的时候,就是一片片的报错,有些问题可以通过异常的提示信息,判断出来哪里配置错了,但是也有些…...
校本教研网站建设方案/优化设计答案四年级上册语文
Numpy数组的索引是一个内容丰富的主题,因为选取数据子集或单个元素的方式有很多。一维数组很简单,跟Python列表的功能差不多 1 In [1]: import numpy as np2 3 In [2]: arr np.arange(10)4 5 In [3]: arr 6 Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, …...
大连做网站价格/网址提交
javascript中的继承实现转载于:https://www.cnblogs.com/daishuguang/p/4190761.html...
easyui做门户网站/友情链接检查工具
本文讲述 MiniGUI 中的对话框和控件编程。首先讲解 MiniGUI 中的控件类和控件实例的关系,并举例说明控件子类化的概念及应用;其次讲解 MiniGUI 对话框的编程技术,包括对话框模板的定义和对话框回调函数的编程;最后解释模态对话框和…...
网站推广的图片/百度热门搜索排行榜
环境Centos 7.4Python 2.7Pip 2.7 MySQL-python 1.2.5 Elasticsearc 6.3.1Elasitcsearch6.3.2知识点调用Python Elasticsearh APIPython Mysqldb使用DSL查询与聚合Python 列表操作代码#!/usr/bin/env python# -*- coding: utf-8 -*-#minyt 2018.9.1#获取24小时内出现的模块次数…...