PHP8.2将有哪些改动(性能改进、新特性)!

目前PHP8.2的发布时间还没有确定,但是预计将在2022年末发布。这篇文章将为你介绍在新版本中的功能、性能改进、弃用的特性等。

目前PHP8.2的发布时间还没有确定,但是预计将在2022年末发布。这篇文章将为你介绍在新版本中的功能、性能改进、弃用的特性等。

相关推荐:PHP8.2最新进展,即将进行新特性冻结!

null和false将作为独立的类型

PHP并不会陷入到完美的类型安全方向中,但是从技术的角度考虑,将null和false作为独立的数据类型是值得的。一般情况下,PHP的很多常见的函数,会通过返回false表示出错了。比如在file_get_content中:

file_get_contents(/* … */): string|false

在以前,false可以在联合类型中使用,但是不能独立使用,在PHP8.2中可以单独使用:

function alwaysFalse(): false
{
return false;
}

当然,对于这个做法,一些开发者都持谨慎态度。他并不支持true作为独立类型。这些开发者们认为,false只是一个值,类型应该代表类别而不是一个值。当然在类型系统中,有一个概念是单元类型,它是只允许一个值的类型。但是这真的有用吗?

不过另一个RFC也正在讨论将true作为一种类型添加到PHP中。

一个独立的null却很有意义,这样可以简单地实现空对象模式:

class Post
{
public function getAuthor(): ?string { /* … */ }
}

class NullPost extends Post
{
public function getAuthor(): null { /* … */ }
}

这对NullPost::getAuthor()能够说它只会返回null,不必像以前那样必须将null和string一起联合声明。

弃用动态属性

对于语言规范来说,这是更好的设计,但是也会限制很多用法。动态属性在PHP8.2中被弃用,并且会在PHP中抛出错误异常。

什么是动态属性?就是你没有在类中声明这些属性,但是仍然可以设置和获取:

class Post
{
public string $title;
}

// …

$post->name = ;Name;; // 在PHP8.2中不能这样使用,因为并没有在类中声明

不过放心,__set和__get等魔术方法将仍然按预期中工作:

class Post
{
private array $properties = [];

public function __set(string $name, mixed $value): void
{
$this->properties[$name] = $value;
}
}

// …

$post->name = ;Name;;

标准对象也是如此:stdClass将继续支持动态属性。

PHP曾经是一种动态程度很强的动态语言,但是现在已经有很多人愿意接受更加严格的编程方式了。尽可能的严格,尽可能的依赖静态分析是一件好事,这能让开发者们写出更好的代码。

不过可能一部分很看重动态属性的开发人员对这种变化会很不满意,如果你不想在使用PHP8.2时看到这些警告,可以这样做:

可以使用#[AllowDynamicProperties]

#[AllowDynamicProperties]
class Post
{
public string $title;
}

// …

$post->name = ;Name;; // 一切正常

另一种方法是修改报警级别,但不建议这样做。等你打算升级到PHP9.0时会遇到麻烦。

error_reporting(E_ALL ^ E_DEPRECATED);

追踪调用时参数脱敏

什么叫参数脱敏?在我们开发时,遇到错误,都会使用Trace调试,但是目前的堆栈记录下一些敏感数据,比如环境变量、密码、用户。

在PHP8.2中允许对参数进行一些编订( Redact ,姑且叫做编订,有一些修饰的意思,但直接称为修饰并不合适),比如将一些参数设置脱敏,这样这些参数的调用值不会在堆栈信息中列出:

function test(
$foo,
#[\SensitiveParameter] $bar,
$baz
) {
throw new Exception(;Error;);
}

test(;foo;, ;bar;, ;baz;);

如果报错的话,会发现,第二个参数bar并没有记录实际的值。这样能起到脱敏的作用,如果传的是密码的话,就不会别记录下来。

Fatal error: Uncaught Exception: Error in test.php:8
Stack trace:
#0 test.php(11): test(;foo;, Object(SensitiveParameterValue), ;baz;)
#1 {main}
thrown in test.php on line 8

弃用了部分对象的调用方式

一些以前的调用对象方式杯弃用了。这里面一些是需要通过call_user_func($callable)来调用的,而不是能够$callable()直接调用的。

;self::method;
;parent::method;
;static::method;
[;self;, ;method;]
[;parent;, ;method;]
[;static;, ;method;]
[;Foo;, ;Bar::method;]
[new Foo, ;Bar::method;]

为什么要这样做呢?Nikita在RFC讨论中很好的做出了解释:

这些废弃的调用都是有关上下文的, “self::method”所指的方法取决于从哪个类执行调用或可调用性检查。实际上,当以[new Foo, ;parent::method;]的形式使用时,这通常也适用于最后两种情况。

减少可调用对象的上下文相关性是本RFC的次要目标。在这个RFC之后,唯一剩下的范围依赖是方法可见性:“Foo::bar”可能在一个范围内可见,但在另一个范围内不可见。如果将来可调用对象仅限于公共方法,那么可调用类型将变得明确定义并且可以用作属性类型。但是,对可见性处理的更改不建议作为本RFC的一部分。

提升对未定义变量的检测机制和级别

未定义的变量是那些在被读取之前还没有被初始化的变量。访问未定义的变量当前会发出E_WARNING“警告:未定义的变量$varname”,并将变量视为null,但不会中断执行,从而允许代码执行继续有增无减,但可能处于意外状态。

目前可以通过一些配置,让PHP执行时对未定义变量产生错误级异常,但这需要单独配置。PHP应当默认提供更安全的检验。

一般什么情况下会出现未定义变量的情况呢?

用法1

变量在某个分支中声明,比如在if中设置一个值。

if ( $user -> admin ) {
$restricted = false ;
}

if ( $restricted ) {
die ( ;你没有进入这里的权限; ) ;
}

用法2

变量拼写错误:

$name = ;Joe;;
echo ;Welcome, ; . $naame;

这种用法在1中也可能会发生:

if ($user->admin) {
$restricted = false;
} else {
$restrictedd = true;
}

if ($restricted) {
die(;You do not have permission to be here;);
}

用法3

在循环中定义,但这个循环可能并没有执行:

while ($item = $itr->next()) {

$counter++; // 定义变量
}

// 这里调用了变量,但是很有可能并没有定义这个变量
echo ;You scanned ; . $counter . ; items;;

解决方法

在这些分支之前提前定义好一个默认值。

对于第1种用法:

$restricted = true;
if ($user->admin) {
$restricted = false;
}

if ($restricted) {
die(;You do not have permission to be here;);
}

对于第3种用法:

$counter = 0;
while ($item = $itr->next()) {
$counter++;
}

echo ;You scanned ; . $counter . ; items;;

这样做的好处是消除了整个访问和使用这些未定义变量的后果,以及回退到引擎默认状态的用户态错误。这样我们提供了另一层保护,防止PHP程序发生了这种意外后继续运行。

这种更改也会让PHP引擎和JIT等方面不会那么复杂。

这个版本主要是针对PHP9.0的,在PHP8.2的还是警告,在以后会将这种行为提升到错误级别。

增加只读类

通过给类添加只读修饰符来声明只读类。

readonly class Test {
public string $prop;
}

这样做会隐式地将类的所有实例属性标记为只读。此外,它将阻止创建动态属性。

readonly class Foo
{
public int $bar;

public function __construct() {
$this->bar = 1;
}
}

$foo = new Foo();
$foo->bar = 2;
// 抛出错误,不能修改只读属性 Foo::$bar

$foo->baz = 1;
// 抛出错误:不能动态创建属性 Foo::$baz

可以通过增加#[AllowDynamicProperties]属性,可以不触发错误的情况下创建动态属性。

#[AllowDynamicProperties]
readonly class Foo {
}

一些限制:

由于是只读类,必须对属性声明类型:

readonly class Foo
{
public $bar;
}
// 以上定义会产生错误。

不能使用静态属性:

readonly class Foo
{
public static int $bar;
}
// 抛出错误: 只读属性不能声明静态类型

原文地址:https://phpreturn.com/index/a626a74a300dc5.html

原文平台:PHP武器库

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

php可以部署到2种web服务器上:1、apache,是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用;2、nginx,是一个高性能的HTTP和反向代理web服务器,同时也提供了“IMAP/POP3/SMTP”服务。

PHP8.2将有哪些改动(性能改进、新特性)!

Linux系统运维及项目正式上线:进入学习

本教程操作环境:windows7系统、PHP8.1版、DELL G3电脑

php常用的web服务器一般有两种:

  • apache

  • nginx

LAMP(linux + apache + mysql + php)和LNMP(linux + ngnix + mysql + php)是目前服务器使用最多的PHP环境架构。

apache服务器

Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。

Apache是一种流行的开源,跨平台的Web服务器,同时它也是现有最流行的web服务器。

Apache HTTP服务器是一个模块化的服务器,源于NCSAhttpd服务器,经过多次修改,成为世界使用排名第一的Web服务器软件。

它可以运行在几乎所有广泛使用的计算机平台上。

Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。

本来它只用于小型或试验Internet网络,后来逐步扩充到各种Unix系统中,尤其对Linux的支持相当完美。Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的最多的Web服务器,市场占有率达60%左右。世界上很多著名的网站如Amazon、Yahoo!、W3 Consortium、Financial Times等都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。

Apache的诞生极富有戏剧性。当NCSAWWW服务器项目停顿后,那些使用NCSAWWW服务器的人们开始交换他们用于该服务器的补丁程序,他们也很快认识到成立管理这些补丁程序的论坛是必要的。就这样,诞生了Apache Group,后来这个团体在NCSA的基础上创建了Apache。

Apacheweb服务器软件拥有以下特性:

1.支持最新的HTTP/1.1通信协议

2.拥有简单而强有力的基于文件的配置过程

3.支持通用网关接口

4.支持基于IP和基于域名的虚拟主机

5.支持多种方式的HTTP认证

6.集成Perl处理模块

7.集成代理服务器模块

8.支持实时监视服务器状态和定制服务器日志

9.支持服务器端包含指令(SSI)

10.支持安全Socket层(SSL)

11.提供用户会话过程的跟踪

12.支持FastCGI

13.通过第三方模块可以支持JavaServlets

如果你准备选择Web服务器,毫无疑问Apache是你的最佳选择。

nginx服务器

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2022年01月25日,nginx 1.21.6发布。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。

Nginx 可以在大多数 Unix Linux OS 上编译运行,并有 Windows 移植版。 Nginx 的1.20.0稳定版已经于2021年4月20日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。

Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性:

在连接高并发的情况下,Nginx是Apache服务不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。

apache与nginx之间有什么区别:

1、二者最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接可以对应一个进程 。nginx处理静态文件好,耗费内存少。但无疑apache仍然是目前的主流,有很多丰富的特性,所以还需要搭配着来。当然如果能确定nginx就适合需求,那么使用nginx会是更经济的方式。

2、nginx的负载能力比apache高很多。最新的服务器也改用nginx了。而且nginx改完配置能-t测试一下配置有没有问题。

3、apache重启的时候发现配置出错了,会很崩溃,改的时候都会非常小心翼翼现在看有好多集群站,前端nginx抗并发,后端apache集群, 配合的也不错。

4、nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向。

5、从经验来看,nginx是很不错的前端服务器,负载性能很好,nginx,用webbench模拟10000个静态文件请求毫不吃力。 apache对php等语言的支持很好,此外apache有强大的支持网络,发展时间相对nginx更久,bug少但是apache有先天不支持多核心处理负载鸡肋的缺点,建议使用nginx做前端,后端用apache。大型网站建议用nginx自代的集群功能。

6、大部分情况下nginx都优于APACHE,比如说静态文件处理、PHP-CGI的支持、反向代理功能、前端 Cache、维持连接等等。在Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数 飙升,从而拒绝服务的现象。

7、Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache吧!

8、一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache吧。

以上就是php可以部署到哪些服务器上的详细内容,更多请关注钦钦技术栈其它相关文章!

转载至:php中文网【www.php.cn】

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/22974/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年9月18日 下午2:44
下一篇 2022年9月18日 下午2:45
软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!