2020特殊的一年,在这一年中爆发了新冠疫情,
但在全国人民的努力下,疫情得到了控制。
2020特殊的一年,在这一年中PHP家族迎来了新成员PHP8
,
在这篇文章中,我们介绍一下php8的安装,以及相关心特性。
因为本人使用的是 Laragon
集成环境,所以介绍其下安装。
PHP8
放到环境目录下 D:\laragon\bin\php
(下载地址)根据自己的本地环境,选择合适的版本,我下载的是php-8.0.1-Win32-vs16-x64.zip
因为 PHP8
需要 VS16
版本的 Apache
,所以我们还需要去下载 Apache
(下载地址)
下载后放到对应的 Apache 目录下,
刚下载完的php中相关扩展是关闭的,这时我们需要打开 php.ini
开启相关扩展
搜索 extension=bz2
,根据需要,开启以下扩展
;extension=bz2
extension=curl
extension=fileinfo
extension=gd
extension=intl
extension=mbstring
extension=mysqli
extension=openssl
extension=pdo_mysql
extension=xsl
这时启动 PHP8
与 Apache
会报一个关于 php8_module
错误
打开 mod_php.conf
文件。把php8_module
修改成 php_module
即可
# This file is auto-generated, so please keep it intact.
LoadModule php_module "D:/laragon/bin/php/php-8.0.1-Win32-vs16-x64/php8apache2_4.dll"
PHPIniDir "D:/laragon/bin/php/php-8.0.1-Win32-vs16-x64"
<IfModule mime_module>
AddType application/x-httpd-php .php
</IfModule>
切换PHP版本,启动相关服务
打开 http://localhost/phpinfo.php
PHP 8 引入了两个即时编译引擎。 Tracing JIT
在两个中更有潜力,它在综合基准测试中显示了三倍的性能, 并在某些长时间运行的程序中显示了 1.5-2 倍的性能改进。 典型的应用性能则和 PHP 7.4 不相上下。
关于 JIT
对 PHP 8
性能的贡献
// PHP 7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
// PHP 8
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
// PHP 7
class PostsController
{
/**
* @Route("/api/posts/{id}", methods={"GET"})
*/
public function get($id) { /* ... */ }
}
// PHP 8
class PostsController
{
#[Route("/api/posts/{id}", methods: ["GET"])]
public function get($id) { /* ... */ }
}
现在可以用 PHP 原生语法来使用结构化的元数据,而非 PHPDoc 声明。
// PHP 7
class Point {
public float $x;
public float $y;
public float $z;
public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}
// PHP 8
class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
}
更少的样板代码来定义并初始化属性。
// PHP 7
class Number {
/** @var int|float */
private $number;
/**
* @param float|int $number
*/
public function __construct($number) {
$this->number = $number;
}
}
new Number('NaN'); // Ok
// PHP 8
class Number {
public function __construct(
private int|float $number
) {}
}
new Number('NaN'); // TypeError
相较于以前的 PHPDoc 声明类型的组合, 现在可以用原生支持的联合类型声明取而代之,并在运行时得到校验。
// PHP 7
switch (8.0) {
case '8.0':
$result = "Oh no!";
break;
case 8.0:
$result = "This is what I expected";
break;
}
echo $result;
//> Oh no!
// PHP 8
echo match (8.0) {
'8.0' => "Oh no!",
8.0 => "This is what I expected",
};
//> This is what I expected
新的 match 类似于 switch,并具有以下功能:
// PHP 7
$country = null;
if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}
// PHP 8
$country = $session?->user?->getAddress()?->country;
现在可以用新的 nullsafe 运算符链式调用,而不需要条件检查 null。 如果链条中的一个元素失败了,整个链条会中止并认定为 Null。
// PHP 7
0 == 'foobar' // true
// PHP 8
0 == 'foobar' // false
PHP 8 比较数字字符串(numeric string)时,会按数字进行比较。 不是数字字符串时,将数字转化为字符串,按字符串比较。
// PHP 7
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given
array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0
// PHP 8
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0
现在大多数内部函数在参数验证失败时抛出 Error 级异常。
本文参考文档:
1、不支持PHP8?
2、教程如何在Windows上升级PHP 8 [完成]
3、https://www.php.net/releases/8.0/zh.php
本文为冯奎原创文章,转载无需和我联系,但请注明来自冯奎博客fengkui.net
最新评论