更加安全的PHP——PHP8新特性介绍

随着2020年11月26日开发者峰会的结束,php开发团队也宣布 PHP 8 正式发布。PHP8作为PHP语言的一个主版本更新,带来了相当多的新功能和优化项包括命名参数、联合类型、注解、构造器属性提升、match 表达式、nullsafe 运算符、JIT,并改进了类型系统、错误处理、语法一致性等。其中大部分内容都与安全和性能有关,那就让我们来看一下这个新版本的PHP有何不同吧。

PHP8前的PHP

PHP作为一门已经存在了26年的编程语言,可以说是比较长寿的语言了。但是作为一门长寿的语言,他有些与时代脱节了。在运行效率上,不如C语言java语言这样的编译型语言。在安全性上因为使用的人数比较多,所以被发现漏洞的几率也就越多。同时因为语法宽松,发现的漏洞也就更多了,最近版本的PHP7就曾爆出过重大漏洞,如果对安全有较高要求的话,PHP将不再是首选的语言。鉴于这些原因,PHP8的优化方向主要是性能和安全。

PHP8新特性

接下来我们来介绍一下PHP8的新特性,了解一下它做了什么更新。

 如果你是初学者,不想关注php8的新特性,或者已经知道了这些新特性,可以直接跳过接下来的一大段介绍,但是相信我,看完这些介绍你会对PHP有一个大的改观。

命名参数

在PHP7中,命名参数的写法为:

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

在PHP8中,命名参数优化为:

htmlspecialchars($string, double_encode: false);
  • 仅仅指定必填参数,跳过可选参数。
  • 参数的顺序无关、自己就是文档(self-documented)

注解

在PHP7中,注解的写法为:

class PostsController
{
    /**
     * @Route("/api/posts/{id}", methods={"GET"})
     */
    public function get($id) { /* ... */ }
}

在PHP8中,注解写法优化为:

class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* ... */ }
}

现在可以用 PHP 原生语法来使用结构化的元数据,而非 PHPDoc 声明。

构造器属性提升

在PHP7中,构造器的写法为:

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;
  }
}

在PHP8中,构造器的写法优化为:

class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}

现在可以用更少的样板代码来定义并初始化属性。

联合类型

在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

相较于以前的 PHPDoc 声明类型的组合, 现在可以用原生支持的联合类型声明取而代之,并在运行时得到校验。

Match表达式

在PHP7中,match表达式的写法为:

switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}
echo $result;
//> Oh no!

在PHP8中,match表达式的写法优化为:

echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

新的 match 类似于 switch,并具有以下功能:

  • Match 是一个表达式,它可以储存到变量中亦可以直接返回。
  • Match 分支仅支持单行,它不需要一个 break; 语句。
  • Match 使用严格比较。

Nullsafe运算符

在PHP7中,nullsafe运算符的写法为:

$country =  null;
if ($session !== null) {
  $user = $session->user;
  if ($user !== null) {
    $address = $user->getAddress();
 
    if ($address !== null) {
      $country = $address->country;
    }
  }
}

在PHP8中,Nullsafe运算符的写法优化为:

$country = $session?->user?->getAddress()?->country;

现在可以用新的 nullsafe 运算符链式调用,而不需要条件检查 null。 如果链条中的一个元素失败了,整个链条会中止并认定为 Null。

字符串与数字的比较逻辑

在PHP7中,字符串与数字的比较逻辑是这样的:

0 == 'foobar' // true

在PHP8中,字符串与数字的比较逻辑是这样的:

0 == 'foobar' // false

PHP 8 比较数字字符串(numeric string)时,会按数字进行比较。 不是数字字符串时,将数字转化为字符串,按字符串比较。

内部函数类型错误的一致性

在PHP7中,内部函数类型错误是这样的:

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

在PHP8中对此进行了优化:

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 级异常。

即时编译

PHP 8 引入了两个即时编译引擎。 Tracing JIT 在两个中更有潜力,它在综合基准测试中显示了三倍的性能, 并在某些长时间运行的程序中显示了 1.5-2 倍的性能改进。 典型的应用性能则和 PHP 7.4 不相上下。

关于 JIT 对 PHP 8 性能的贡献

Just-In-Time compilation

类型系统与错误处理的改进

  • 算术/位运算符更严格的类型检测 RFC
  • Abstract trait 方法的验证 RFC
  • 确保魔术方法签名正确 RFC
  • PHP 引擎 warning 警告的重新分类 RFC
  • 不兼容的方法签名导致 Fatal 错误 RFC
  • 操作符 @ 不再抑制 fatal 错误。
  • 私有方法继承 RFC
  • Mixed 类型 RFC
  • Static 返回类型 RFC
  • 内部函数的类型 Email thread
  • 扩展 Curl、 Gd、 Sockets、 OpenSSL、  XMLWriter、 XML 以 Opaque 对象替换 resource。

其他语法调整和改进

  • 允许参数列表中的末尾逗号 RFC、 闭包 use 列表中的末尾逗号 RFC
  • 无变量捕获的 catch RFC
  • 变量语法的调整 RFC
  • Namespace 名称作为单个 token RFC
  • 现在 throw 是一个表达式 RFC
  • 允许对象的 ::class RFC

新的类、接口、函数

是否升级到PHP8?

PHP 8是一个新的大版本,很多代码的写法都进行了优化,如果要将项目升级为PHP8,代码被破坏的可能性更高,不过如果你使用的是最新版本的PHP,升级起来就会比较轻松,因为其中的大多数重大更改在PHP7中已经弃用。

小结

纵观近年来PHP占有率下滑,既有外部对手强大的原因,也有PHP自身不足的原因。PHP8作为新版本的PHP,它的目标就是让PHP保住市场占有量,所以小编还是很期待PHP8给小编带来的开发体验的。

以上就是关于PHP 8新特性的全部介绍,更多PHP学习内容可以关注W3Cschool

原文地址:https://www.w3cschool.cn/article/41824727.html

学习资源:自相矛盾

自相矛盾,汉语成语,拼音是zì xiāng máo dùn。意思是比喻自己说话做事前后抵触。出自《韩非子·难一》。
出自于《韩非子》,讲的是:有一个楚国人卖矛又卖盾,说他的盾坚固得很,不管是用什么矛都戳不穿,说他的矛锐利得很,不管是什么盾都戳的穿。有个围观的人问道:“用你自己的矛刺你自己的盾会怎么样”时,此人无以对答。后来因为以形容某行事或言语前后不统一。也指不连贯的性格或心情。后因以喻人的语言行动前后抵触、不相应合。 [1]
矛:进攻敌人的刺击武器;盾:保护自己的盾牌。比喻自己说话做事前后抵触。 [2]

成语用法

编辑

主谓式;作谓语、定语。不能用于两方以上,只能用于单方自我抵触。成语用法

示例

  1. 毛泽东论持久战》:“英勇战斗于前,又放弃土地在后,不是自相矛盾吗?”。
  2. 资治通鉴·梁武帝太清二年》:“今二宫危逼,猾寇滔天,臣子当戮力同心,岂可自相矛盾?” [2]

成语出处

编辑

《韩非子·难一》:“楚人有鬻盾与矛者,誉之曰:‘吾盾之坚,物莫之能陷也。’又誉其矛曰:‘吾矛之利,于物无不陷也。’或曰:‘以子之矛陷子之盾,何如?其人弗能应也。夫不可陷之盾与无不陷之矛,不可同世而立。

成语典故

编辑

原文
出自《韩非子·难一》:楚人有鬻盾与矛者,先誉其盾之坚,誉之曰:“吾盾之坚,物莫能陷也。”又誉其矛曰:“吾矛之利,于物无不陷也。”或曰:”以子之矛陷子之盾,何如?”其人弗能应也。众皆笑之。夫不可陷之盾与无不陷之矛,不可同世而立。 [1]
注释
楚人:楚国人
鬻(yù):卖。
誉:称赞,这里有夸耀,吹嘘的意思。
陷:刺破,这里有“穿透”、“刺穿”的意思。
利:锋利。
或:有人,别人
以:用。
弗:不 。
应:回答。
夫(fú):放在句首,表示将发议论。
译文
战国时期,楚国有个卖矛和盾的人,他先夸耀自己的盾很坚硬,说:“无论用什么东西都无法破坏它!”然后,他又夸耀自己的矛很锐利,说:“无论什么东西都能被其破坏!”,市场上的人质问他:“如果用你的矛去刺你的盾,它们将怎么样?”,那个人无法回答。众人嘲笑他。无法被刺穿的盾牌和刺得破所有盾的长矛,是不可能共同存在的。

揭示道理

世上不可能共同存在牢不可破的盾和无坚不摧的矛,这个楚国人片面地夸大了矛与盾的作用,结果出现无法自圆其说的局面。比喻说话做事前后抵触,不能自圆其说。
做事说话皆应三思而后行。 [2]

互联网用户账号信息管理规定

《互联网用户账号信息管理规定》旨在加强对互联网用户账号信息的管理,弘扬社会主义核心价值观,维护国家安全和社会公共利益,保护公民、法人和其他组织的合法权益,促进互联网信息服务健康发展。由国家互联网信息办公室发布,自2022年8月1日起施行。

互联网用户账号信息管理规定
第一章 总则
第一条 为了加强对互联网用户账号信息的管理,弘扬社会主义核心价值观,维护国家安全和社会公共利益,保护公民、法人和其他组织的合法权益,根据《中华人民共和国网络安全法》、《中华人民共和国个人信息保护法》、《互联网信息服务管理办法》等法律、行政法规,制定本规定。
第二条 互联网用户在中华人民共和国境内的互联网信息服务提供者注册、使用互联网用户账号信息及其管理工作,适用本规定。法律、行政法规另有规定的,依照其规定。
第三条 国家网信部门负责全国互联网用户账号信息的监督管理工作。
地方网信部门依据职责负责本行政区域内的互联网用户账号信息的监督管理工作。
第四条 互联网用户注册、使用和互联网信息服务提供者管理互联网用户账号信息,应当遵守法律法规,遵循公序良俗,诚实信用,不得损害国家安全、社会公共利益或者他人合法权益。
第五条 鼓励相关行业组织加强行业自律,建立健全行业标准、行业准则和自律管理制度,督促指导互联网信息服务提供者制定完善服务规范、加强互联网用户账号信息安全管理、依法提供服务并接受社会监督。
第二章 账号信息注册和使用
第六条 互联网信息服务提供者应当依照法律、行政法规和国家有关规定,制定和公开互联网用户账号管理规则、平台公约,与互联网用户签订服务协议,明确账号信息注册、使用和管理相关权利义务。
第七条 互联网个人用户注册、使用账号信息,含有职业信息的,应当与个人真实职业信息相一致。
互联网机构用户注册、使用账号信息,应当与机构名称、标识等相一致,与机构性质、经营范围和所属行业类型等相符合。
第八条 互联网用户注册、使用账号信息,不得有下列情形:
(一)违反《网络信息内容生态治理规定》第六条、第七条规定;
(二)假冒、仿冒、捏造政党、党政军机关、企事业单位、人民团体和社会组织的名称、标识等;
(三)假冒、仿冒、捏造国家(地区)、国际组织的名称、标识等;
(四)假冒、仿冒、捏造新闻网站、报刊社、广播电视机构、通讯社等新闻媒体的名称、标识等,或者擅自使用“新闻”、“报道”等具有新闻属性的名称、标识等;
(五)假冒、仿冒、恶意关联国家行政区域、机构所在地、标志性建筑物等重要空间的地理名称、标识等;
(六)以损害公共利益或者谋取不正当利益等为目的,故意夹带二维码、网址、邮箱、联系方式等,或者使用同音、谐音、相近的文字、数字、符号和字母等;
(七)含有名不副实、夸大其词等可能使公众受骗或者产生误解的内容;
(八)含有法律、行政法规和国家有关规定禁止的其他内容。
第九条 互联网信息服务提供者为互联网用户提供信息发布、即时通讯等服务的,应当对申请注册相关账号信息的用户进行基于移动电话号码、身份证件号码或者统一社会信用代码等方式的真实身份信息认证。用户不提供真实身份信息,或者冒用组织机构、他人身份信息进行虚假注册的,不得为其提供相关服务。
第十条 互联网信息服务提供者应当对互联网用户在注册时提交的和使用中拟变更的账号信息进行核验,发现违反本规定第七条、第八条规定的,应当不予注册或者变更账号信息。
对账号信息中含有“中国”、“中华”、“中央”、“全国”、“国家”等内容,或者含有党旗、党徽、国旗、国歌、国徽等党和国家象征和标志的,应当依照法律、行政法规和国家有关规定从严核验。
互联网信息服务提供者应当采取必要措施,防止被依法依约关闭的账号重新注册;对注册与其关联度高的账号信息,应当对相关信息从严核验。
第十一条 对于互联网用户申请注册提供互联网新闻信息服务、网络出版服务等依法需要取得行政许可的互联网信息服务的账号,或者申请注册从事经济、教育、医疗卫生、司法等领域信息内容生产的账号,互联网信息服务提供者应当要求其提供服务资质、职业资格、专业背景等相关材料,予以核验并在账号信息中加注专门标识。
第十二条 互联网信息服务提供者应当在互联网用户账号信息页面展示合理范围内的互联网用户账号的互联网协议(IP)地址归属地信息,便于公众为公共利益实施监督。
第十三条 互联网信息服务提供者应当在互联网用户公众账号信息页面,展示公众账号的运营主体、注册运营地址、内容生产类别、统一社会信用代码、有效联系方式、互联网协议(IP)地址归属地等信息。
第三章 账号信息管理
第十四条 互联网信息服务提供者应当履行互联网用户账号信息管理主体责任,配备与服务规模相适应的专业人员和技术能力,建立健全并严格落实真实身份信息认证、账号信息核验、信息内容安全、生态治理、应急处置、个人信息保护等管理制度。
第十五条 互联网信息服务提供者应当建立账号信息动态核验制度,适时核验存量账号信息,发现不符合本规定要求的,应当暂停提供服务并通知用户限期改正;拒不改正的,应当终止提供服务。
第十六条 互联网信息服务提供者应当依法保护和处理互联网用户账号信息中的个人信息,并采取措施防止未经授权的访问以及个人信息泄露、篡改、丢失。
第十七条 互联网信息服务提供者发现互联网用户注册、使用账号信息违反法律、行政法规和本规定的,应当依法依约采取警示提醒、限期改正、限制账号功能、暂停使用、关闭账号、禁止重新注册等处置措施,保存有关记录,并及时向网信等有关主管部门报告。
第十八条 互联网信息服务提供者应当建立健全互联网用户账号信用管理体系,将账号信息相关信用评价作为账号信用管理的重要参考指标,并据以提供相应服务。
第十九条 互联网信息服务提供者应当在显著位置设置便捷的投诉举报入口,公布投诉举报方式,健全受理、甄别、处置、反馈等机制,明确处理流程和反馈时限,及时处理用户和公众投诉举报。
第四章 监督检查与法律责任
第二十条 网信部门会同有关主管部门,建立健全信息共享、会商通报、联合执法、案件督办等工作机制,协同开展互联网用户账号信息监督管理工作。
第二十一条 网信部门依法对互联网信息服务提供者管理互联网用户注册、使用账号信息情况实施监督检查。互联网信息服务提供者应当予以配合,并提供必要的技术、数据等支持和协助。
发现互联网信息服务提供者存在较大网络信息安全风险的,省级以上网信部门可以要求其采取暂停信息更新、用户账号注册或者其他相关服务等措施。互联网信息服务提供者应当按照要求采取措施,进行整改,消除隐患。
第二十二条 互联网信息服务提供者违反本规定的,依照有关法律、行政法规的规定处罚。法律、行政法规没有规定的,由省级以上网信部门依据职责给予警告、通报批评,责令限期改正,并可以处一万元以上十万元以下罚款。构成违反治安管理行为的,移交公安机关处理;构成犯罪的,移交司法机关处理。
第五章 附则
第二十三条 本规定下列用语的含义是:
(一)互联网用户账号信息,是指互联网用户在互联网信息服务中注册、使用的名称、头像、封面、简介、签名、认证信息等用于标识用户账号的信息。
(二)互联网信息服务提供者,是指向用户提供互联网信息发布和应用平台服务,包括但不限于互联网新闻信息服务、网络出版服务、搜索引擎、即时通讯、交互式信息服务、网络直播、应用软件下载等互联网服务的主体。
第二十四条 本规定自2022年8月1日施行。本规定施行之前颁布的有关规定与本规定不一致的,按照本规定执行。

《互联网用户账号信息管理规定》旨在加强对互联网用户账号信息的管理,弘扬社会主义核心价值观,维护国家安全和社会公共利益,保护公民、法人和其他组织的合法权益,促进互联网信息服务健康发展。由国家互联网信息办公室发布,自2022年8月1日起施行。