
当人们讨论PHP7的变化时,您最常听到的是引擎的显着改进,当比较常见的PHP应用程序(例如Drupal,WordPress和MediaWiki)时,它具有更快的执行速度和显着更少的内存。
不要误会我的意思,这当然很棒! 我能够将几个旧版CodeIgniter应用程序移植到PHP7,并通过对代码库进行一些更改来获得更好的性能。 但是,PHP7还添加了一些新功能,可以帮助优化现有代码或提高编写新代码的质量。 在这里,我概述了一些我选择的功能。
标量参数和声明类型的返回
PHP的类型声明一直到版本7,但仅限于对象和数组。 PHP7现在提供对所有标量类型的支持,并提供两种不同的类型声明。
强制:
它是声明的默认类型,仅表示PHP运行时将在必要时尝试强制转换值。 以下面的代码为例。
<?php function reverseString(String $str) : String { return strrev($str); } print(reverseString(1234));
我们指示参数$str
必须为String
类型,并且返回值也必须为String
类型。 因此,当我们传递数字1234时,它将被强制转换为字符串“ 1234”并进行无误转换。
严格:
使用每个文件开头添加的标志启用第二种严格类型。 当打开它时,解释器不会强制转换类型,如上例所示,它会以错误响应并停止脚本。
<?PHP declare(strict_types = 1); function reverseString(String $str): String { return strrev($str); } print (reverseString(1234));
以与以前相同的代码在文件的开头添加一个declare
语句,现在我们收到以下错误消息:
致命错误:未捕获的TypeError:传递给reverseString()的参数1必须为字符串类型,给定整数
一个小的补充:启用严格模式时,这也适用于内置函数和从扩展加载的PHP函数。
空运算符??
与某些语言不同,在某些语言中,您可以将变量名用作if
表达式中的表达式,并可以安全地假定如果该值未定义或为空,则该值将为false
,PHP会引发有关未定义变量,索引等的错误。这使得if
语言比其他语言非常冗长,常规,例如下面的示例。
<?php if(!isset($_GET['key'])) { $key = 'default-value'; } else { $key = $_GET['key']; }
即使使用三元运算符,也需要isset
函数。 使用新的null运算符??
您可以大大简化代码:
<?PHP $key = $_GET['key'] ?? 'default_value';
在需要一个或多个其他if
链接情况下,这种用法更加有效。
<?php if (isset($_GET['key']) { $key = $_GET['key']; } else if(isset($_POST['key'])) { $key = $_POST['key']; } else { $key = 'default value'; }
补充一点:如果您使用JavaScript,则可以执行以下操作:
const value = 0 || false || 'hello'; console.log(value);
这不适用于PHP,并且等效的PHP代码会将值设置为0,因为new运算符仅适用于null
值。
组使用声明
在以前的PHP版本中,只能使用use声明在单个表达式中从特定名称空间导入一个元素(类,函数,常量)。 这通常会导致代码重复,例如下面的示例。
<?php use VendorName/LibraryName/ClasName1; use VendorName/LibraryName/ClasName2; use VendorName/LibraryName/ClasName3;
进行分组时,可以缩写为上面的代码,如下面的示例所示,它使您可以更清晰,更直观地了解导入的内容以及从何处导入的代码。
<?php use VendorName/LibraryName/{ClasName1, ClassName2. ClassName3};
常数数组
命名常量是PHP中非常有价值的工具。 一种常见的用例是通过为任意数据提供语义名称(例如颜色,RGB值或代码中的模棱两可的数字)来提高代码的可读性,而在其他情况下它们可能会造成混淆。
长期使用PHP的任何人都最有可能看到一个带有常量文件(甚至几个文件)的应用程序,该文件包含数十个(甚至不是数百个)命名常量,需要长而描述性的名称,以避免名称冲突。
<?php define('COLOR_RED', '#f44141'); define('COLOR_BLUE', '#4286f4'); define('COLOR_GREEN', '#1ae01e'); define('COLOR_PURPLE', '#f309f7'); define('COLOR_ORANGE', '#ef7700');
除先前支持的数据类型外,命名常量可以是索引数组或关联数组。 这将有助于更准确地对应用程序中可能具有的许多命名常量进行分组。
<?php
结论
我还没有提到其他一些很棒的新功能,例如匿名类和太空飞船操作员。 因此,一定要查看PHP.net文档以获得更多信息。 感谢您抽出宝贵的时间阅读所有这些内容,请在下面留下任何问题或评论。
感谢贝雷兹的评论。