2

快速掌握新版本PHP新功能的技巧

 2 years ago
source link: https://segmentfault.com/a/1190000041130373
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

最新PHP版本更新迭代非常快,很多小伙伴都直呼学不动了。又因为文档具有一定的滞后性,看全英文RFC也是有点门槛的事情。所以本文想教大家一种比较快速全面了解新功能的技巧。

技巧说起来非常简单,看 PHP 源码中的单元测试.

因为单元测试要考虑到的场景非常多,所以用例非常全面,有些文档中没有细说的东西,单元测试代码都能清晰地体现出来.

话不多说,开始整活.

git clone https://github.com/php/php-src

看单元测试

各个扩展的单元测试在 ext/扩展名/tests,以 phpt 后缀结尾的文件就是单元测试文件.
内嵌函数的单元测试在 Zend/tests.

以箭头函数为例

Zend/tests/arrow_functions 目录下,看一下 001.phpt 里的内容.

--TEST--
Basic arrow function functionality check
--FILE--
<?php

$foo = fn() => 1;
var_dump($foo());

$foo = fn($x) => $x;
var_dump($foo(2));

$foo = fn($x, $y) => $x + $y;
var_dump($foo(1, 2));

// Closing over $var
$var = 4;
$foo = fn() => $var;
var_dump($foo());

// Not closing over $var, it's a parameter
$foo = fn($var) => $var;
var_dump($foo(5));

// Close over $var by-value, not by-reference
$var = 5;
$foo = fn() => ++$var;
var_dump($foo());
var_dump($var);

// Nested arrow functions closing over variable
$var = 6;
var_dump((fn() => fn() => $var)()());
var_dump((fn() => function() use($var) { return $var; })()());

?>
--EXPECT--
int(1)
int(2)
int(3)
int(4)
int(5)
int(6)
int(5)
int(6)
int(6)

分成三段:
第一段,本次测试的主题描述 --TEST--.
第二段,本次单测的PHP代码 --FILE--.
第三段,本次单测预期的输出,如果期待输出是错误用 --EXPECTF--,否则使用 --EXPECT--

基本上 PHP 源码中所有的单元测试都是这种格式.

第一个单测用例就是测一测箭头函数的基本使用是否符合预期,非常简单,示例我就不详细说明了.

看看箭头函数其它的用例,第二个单测文件:

--TEST--
Arrow functions implicit use must be throwing notices only upon actual use
--FILE--
<?php

$b = 1;

var_dump((fn() => $b + $c)());

?>
--EXPECTF--
Warning: Undefined variable $c in %s on line %d
int(1)

也非常简单,目的是想告诉我们,定义箭头函数的时候,使用未定义的变量不会报错,只有在实际用到时才会抛出错误。也就是说:

<?php
$a = 1;
$func = fn() => $a + $b;

这样是不会报错的,只有下面的代码才会抛出错误。

<?php
$a = 1;
$func = fn() => $a + $b;
$func();

这种细节RFC里似乎都没有提到,只有通过单元测试代码才能注意到。

有兴趣的同学可以挑几个新功能的单测看看,看完了保证你有所收获,对新功能新语法有更全面的了解。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK