PHP8.0新特性全面解析及公益免费直播课预告,本周四晚八点开播
本文的主要内容是PHP8.0的主要新功能。

预告片:PHP8公共福利免费现场课程将于本周四晚上8点开始,请继续关注!前言
PHP8于2020年11月26日正式发布,另一个里程碑到达。
根据官方网站上的信息,它已发布到8.0.2版,但许多项目仍在5.6版上。
卡卡将分析PHP8.0的新功能。
1。下载小型皮革面板的PHP8
由于您必须学习新功能,因此必须先下载它。
卡卡的本地环境一直用于phpstudy。目前,PHP版本仅提供7.4。
打开PHP的官方网站地址,然后选择下载窗口。
注意:以上是我自己的手册DIY,这有点麻烦。因此,PHP中国网站开发了一种支持PHP8的集成环境工具。
下载方式
然后单击Kaka Circle中的此下载。
PHP源代码下载
下载的源代码可以直接放置到d:\ phpstudy_pro \ Extensions \ PHP
然后只给文件一个名称,卡卡是根据phpstudy的目录结构编写的
PHP目录结构
然后跳到面板的PHP环境,为PHP8设置环境
设置PHP环境
访问!
PHP8.0环境配置2。部分下载PHP8将出现502解决方案
如果您下载PHP8,它也会根据卡卡进程执行,但在面试时返回502。
因此,不用担心,如果您发现PHP无法成功运行,这只是一个小问题。
使用CMD进入PHP8目录,执行PHP -V命令,如果以下情况显示Kaka表示可以解决此问题。
发生以下错误,因为vcruntime140.dll与PHP版本不兼容
PHP Warning: 'C:\Windows\SYSTEM32\VCRUNTIME140.dll' 14.0 is not compatible with this PHP build linked with 14.28 in Unknown on line 0
解决这个问题也很简单。 Kaka已下载该软件,单击并直接下载。
下载后,直接打开安装,然后重新启动计算机。
如果您不使用Kaka提供的安装程序包,也可以直接下载官方网站。
输入官方网站后,将其拉到底部,有一个工具和框架,然后单击要下载的工具和框架。
下载软件III。简介功能
版本更新迭代将具有新功能,并且将放弃一些旧功能。
让我们来谈谈哪些新功能php8.0带来!
1。联合类型
关于组合类型的特征实际上,它是在PHP7中实现的,但在注释的形式中。
现在看看两者之间的区别。下图来自PHP的官方网站。
这张照片来自PHP的官方网站
设置参数类型后,如果设置了PHP8的类型,则传递类型和预设类型不会直接报告错误。
PHP8组合类型
错误信息
但是,PHP7不同。尽管类型是预设的,但可以在非相应类型中执行。
PHP7执行结果
此功能可用于限制参数类型并更好地过滤参数。
2。匹配表达式
此功能类似于PHP7的开关语句。
1。匹配匹配单值
与开关隐藏休息相比
$name = match(2) {
1 => 'kaka',
2 => 'niuiniu',
};
echo $name; // niuiniu
2。匹配多个条件
$method = $_SERVER['REQUEST_METHOD'];
match($method) {
'post' => $this->handlePost(),
'get','put' => $this->handleGet(),
};
3。默认值
开关默认有相同的属性
$name = match(3) {
1 => 'kaka',
2 => 'niuniu',
default => 'heihei',
};
echo $name; // heihei
4。如果未设置默认值,将报告错误
如果未设置默认值,则会报告一个错误
$name = match(3) {
1 => 'kaka',
2 => 'niuniu',
};
echo $name; // Uncaught UnhandledMatchError: Unhandled match value of type int
5。强制性类型匹配
默认强制性类型匹配,以下代码匹配值是int,但是搜索值是字符串3,因此您将直接转到默认值
$name = match(3) {
1 => 'kaka',
2 => 'niuniu',
"3" => 'niuniu',
default => 'zero',
};
echo $name; // zero
3。无效安全新动机特征
此功能将非常有效地解决代码的冗余。
在PHP7中,有时会有许多有条件的类属性判断,如下所示
class Person{
public $user;
public $country;
public function __construct(){
$this->user = $this;
$this->country='yes';
}
public function getAddress(){
return $this;
}
}
$session=new Person();
if($session!==null){
$user = $session->user;
if($user!==null){
$address = $user->getAddress();
if($address!=null){
$country = $address->country;
if($country!==null){
var_dump($country);
}
}
}
}
以上代码返回结果是字符串(3)“是”
但是在PHP8中,该代码冗余的问题完美解决了问题
PHP8代码
代码
class Person{
public $user;
public $country;
public function __construct(){
$this->user = $this;
$this->country='yes';
}
public function getAddress(){
return $this;
}
}
$session=new Person();
echo $session?->user?->getAddress()?->country;
相同的返回结果是字符串(3)“是”
您可以看到可以在PHP8中使用一行代码来实现PHP7的7行代码,不是很好吗?
4。提高建设性函数属性
PHP7施工功能代码
class User {
public string $kaka;
public function __construct(string $kaka) {
$this->kaka = $kaka;
}
}
PHP8施工功能代码
class User {
public function __construct(public string $kaka;)
{
echo $this->kaka;
}
}
5。注意
在编写了这些功能之后,新添加的注释感到在编写这些功能后,这不是很有用。据估计它仍然很碗。
但是,对于文章的完整性,我仍然为您编写。
该代码直接打开,使用以下代码获得了PHP7获得代码的注释。
class User {
/**
* @api http://www.kaka.com/api
*/
function show($name){}
}
$re=new ReflectionClass(new User);
$doc = $re->getMethod('show')->getDocComment();
$res=substr($doc, strpos($doc, "@api") + strlen("@api "),-2);
var_dump($res); // string(32) "http://www.kaka.com/api "
上述代码中的几个字符串的操作被使用。假设评论不是标准化的,则错误的可能性不如您编写代码。
由于存在这样的问题,因此官员为我们解决了这个问题,然后看一下它在PHP8中的写作。
#[api("http://www.kaka.com/api")]
function show($name){}
$ref=new ReflectionFunction("show");
$attr=$ref->getAttributes("api")[0];
$name=$attr->getName();
$value=$attr->getArguments();
var_dump($value[0]);// string(24) "http://www.kaka1.com/api"
我没有说班级的注释。如果您有兴趣,可以访问官方网站以检查相关信息。
6。名称参数
关于PHP8命名参数的最后一点
例如,所有位置参数均在PHP7中使用,如下所示。
也就是说,您传达的参数是该方法收到的位置。
class User {
public function paramTest ($name,$age)
{
var_dump($name.$age);
}
}
$user = new User();
$user->paramTest('咔咔',24); // string(8) "咔咔24"
然后将新功能添加到php8,即命名参数,如下所示
与上述代码不同,当方法传递时,每个参数都会命名,但是名称只能是一个没有$的参数。
就代码的维护而言,在维护代码方面没有任何优势。我们不知道该设计什么!
class User {
public function paramTest ($name,$age)
{
var_dump($name.$age);// string(8) "24咔咔"
}
}
$user = new User();
$user->paramTest(age: '咔咔',name: 24);
但是在参数中,它仍然具有赞美,即可变参数,类似于shices
但是要注意的一件事是,如果使用变量参数,则在传递时不能使用位置参数,并且需要使用所有命名参数。
class User {
public function paramTest ($name,$age,...$other)
{
var_dump($other);
// array(2) { ["sex"]=> int(1) ["like"]=> string(6) "篮球" }
}
}
$user = new User();
$user->paramTest(age: '咔咔',name: 24,sex:1,like:"篮球");
第四,摘要