在此篇文章中,我们将用 15 分钟对 PHP v7.x 版本更改进行简要回顾。
PHP 7.3 版本发布后,为了更好地理解这门广泛盛行的编程语言的新特性和优化之处,我决定详细地研究下 PHP 开发:正在开发什么以及其开发方向。
我的官方群点击进入
说到做到,150粉丝福利安排PHP进阶资料,免费获取
在查看了 PHP 在 PHP 7.x 版本开发过程中实现的一系列特性的简要列表之后,我决定自己整合这个列表作为一个很好的补充,我相信也会有人以为有用的。
我们将从 PHP 5.6 作为基准开始,研究添加或者更改了哪些内容。同时,我也在每一个被提及到的特性处添加了直达相关官方文档的链接,所以如果你有爱好深入阅读,请随意。
PHP 7.0
匿名类的支持
在下面两种环境下,匿名类可能会被使用在命名类中:
- 当该类没有必要被记录下来的时候
- 当该类在程序实行过程中只使用一次的时候
new class($i) { public function __construct($i) { $this->i = $i; }}整除函数 — 安全的除法 (纵然是被 0 整除)
该函数会返回第一个参数被第二个参数整除后效果的整数部分。当除数(也就是第二个参数)值为 0 时,该函数会抛出一个 E_WARNING 的错误并且返回 FALSE。
intdiv(int $numerator, int $divisor)增加了新的空合并操作赋 — 也就是 “??”
$x = NULL;$y = NULL;$z = 3;var_dump($x ?? $y ?? $z); // int(3)$x = ["c" => "meaningful_value"];var_dump($x["a"] ?? $x["b"] ?? $x["c"]); // string(16) "meaningful_value"添加新的操作符 — 飞船符 ()
飞船符用于优化和简化比较操作。
// 使用 (飞船符)前function order_func($a, $b) { return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);}// 使用 (飞船符)之后function order_func($a, $b) { return $a $b;}标量范例声明
这只是在 PHP — v0.5 中实现更强范例编程语言特性的第一步。
function add(float $a, float $b): float { return $a + $b;}add(1, 2); // float(3)返回范例声明
增加了返回包括继承在内的标量类之外的其他范例的特性。不知何故没有将其设置为可选特性 (将在 v7.1 中说明 )
interface A { static function make(): A;}class B implements A { static function make(): A { return new B(); }}组使用声明
// 显式使用语法:use FooLibrary\Bar\Baz\ClassA;use FooLibrary\Bar\Baz\ClassB;use FooLibrary\Bar\Baz\ClassC;use FooLibrary\Bar\Baz\ClassD as Fizbo;// 分组使用语法:use FooLibrary\Bar\Baz\{ ClassA, ClassB, ClassC, ClassD as Fizbo };生成器委托
生成器函数体中允许使用如下新的语法:
yield from 性能提升
PHP 7 比 PHP 5.6 快上两倍。
明显降低内存占用
从图表中可以看出, PHP 7.0 在性能和(减少)内存占用上有巨大改进。 对于带有数据库查询的页面,7.0.0 版本在启用 opcache 的环境下比 5.6 版本 快 3 倍,在未启用 opcache 的环境下比其 快 2.7 倍。在内存占用方面,两者的差异也是非常明显的。
Throwable 接口 **
** 重构的异常类具有非直观的命名方案,并且可以减少混淆,特别是对于初学者。
Errors 和 Exceptions 现在 实现了 Throwable.
这是 Throwable 条理结构:
interface Throwable|- Error implements Throwable |- ArithmeticError extends Error |- DivisionByZeroError extends ArithmeticError |- AssertionError extends Error |- ParseError extends Error |- TypeError extends Error |- ArgumentCountError extends TypeError|- Exception implements Throwable |- ClosedGeneratorException extends Exception |- DOMException extends Exception |- ErrorException extends Exception |- IntlException extends Exception |- LogicException extends Exception |- BadFunctionCallException extends LogicException |- BadMethodCallException extends BadFunctionCallException |- DomainException extends LogicException |- InvalidArgumentException extends LogicException |- LengthException extends LogicException |- OutOfRangeException extends LogicException |- PharException extends Exception |- ReflectionException extends Exception |- RuntimeException extends Exception |- OutOfBoundsException extends RuntimeException |- OverflowException extends RuntimeException |- PDOException extends RuntimeException |- RangeException extends RuntimeException |- UnderflowException extends RuntimeException |- UnexpectedValueException extends RuntimeException* 警告!你只能
通过继承 Error 和 Exception 来实现 Throwable,
也就是说一个继承自 Throwable 的接口只能被 Exception 或 Error 的子类来实现。
Unicode Codepoint 转义语法 ** — “\u{xxxxx}”**
echo "\u{202E}Reversed text"; //输出反转文本echo "maana"; // "ma\u{00F1}ana"echo "maana"; // "man\u{0303}ana" "n" 结合 ~ 字符 (U+0303)上下文敏感的语法分析器
* 全局保存的单词都成为了 * 半保存:
callable class trait extends implements static abstract final public protected private constenddeclare endfor endforeach endif endwhile and global goto instanceof insteadof interfacenamespace new or xor try use var exit list clone include include_once throw arrayprint echo require require_once return else elseif default break continue switch yieldfunction if endswitch finally for foreach declare case do while as catch die self parent除了仍然克制界说一个名为 class 的 类常量 之外,因为类名解析 ::class。
生成器返回表达式
统一变量语法
dirname () 函数的级别支持
PHP 7.1
可空范例
function answer(): ?int { return null; //成功}function answer(): ?int { return 42; // 成功}function answer(): ?int { return new stdclass(); // error}function say(?string $msg) { if ($msg) { echo $msg; }}say('hello'); // 成功 -- 打印 hellosay(null); // 成功 -- 不打印say(); // 错误 -- 参数丢失say(new stdclass); //错误 --错误范例Void 返回
function should_return_nothing(): void { return 1; // 致命错误: void 函数不能有返回值}与调用函数时强制实行的其他返回范例不同, 这个范例会在编译时查抄,这意味着错误会在函数没有调用的时候就会产生。
具有 void 返回范例或者 void function 的函数可以隐式返回,也可以使用不带值的返回语句:
function lacks_return(): void { // valid}可迭代的伪范例
函数通常担当或者返回 array 或者实现一个与 foreach 一起使用的 Traversable 对象。 但是,因为 array 是一个基本范例而 Traversable 是一个接口,所以目前无法在参数或返回范例上使用范例声明来指示该值是可迭代的。
function foo(iterable $iterable) { foreach ($iterable as $value) { // ... }}iterable 也可以用作返回范例,体现函数将返回一个可迭代的值。 如果返回的值不是 Traversable 的数组或实例,则抛出 TypeError。
function bar(): iterable { return [1, 2, 3];}声明为 iterable 的参数可以使用 null 或数组作为默认值。
function foo(iterable $iterable = []) { // ...}可调用的闭包
class Closure { ... public static function fromCallable(callable $callable) : Closure {...} ...}数组结构赋值的方括号语法
$array = [1, 2, 3];//为 $a,$b 和 $c 按键值从 0 开始的方式分配 $array 数组元素的值[$a, $b, $c] = $arry;// 使用 “a”,“b” 和 “c” 键分别为 $a,$b 和 $c 分配 $array 中数组元素的值["a" => $a, "b" => $b, "c" => $c] = $array;list() 的方括号语法
$powersOfTwo = [1 => 2, 2 => 4, 3 => 8];list(1 => $oneBit, 2 => $twoBit, 3 => $threeBit) = $powersOfTwo;类常量的可见性
class Token { // 常量默以为 public const PUBLIC_CONST = 0; // 常量也可以界说可见性 private const PRIVATE_CONST = 0; protected const PROTECTED_CONST = 0; public const PUBLIC_CONST_TWO = 0; //常量只能有一个可见性声明列表 private const FOO = 1, BAR = 2;}捕捉多个异常范例
try {// 部分代码...} catch (ExceptionType1 | ExceptionType2 $e) {// 处置惩罚异常的代码} catch (\Exception $e) {// ...}PHP 7.2
参数范例扩大 |