最新PHP版本更新迭代十分快,很多小伙伴都直呼学不动了。又因为文档具备肯定的滞后性,看全英文RFC也是有点门槛的事件。所以本文想教大家一种比拟疾速全面理解新性能的技巧。
技巧说起来非常简单,看 PHP 源码中的单元测试.
因为单元测试要思考到的场景十分多,所以用例十分全面,有些文档中没有细说的货色,单元测试代码都能清晰地体现进去.
话不多说,开始整活.
下载源码
<code class="shell">git clone https://github.com/php/php-src
看单元测试
各个扩大的单元测试在 ext/扩展名/tests
,以 phpt
后缀结尾的文件就是单元测试文件.
内嵌函数的单元测试在 Zend/tests
.
以箭头函数为例
在 Zend/tests/arrow_functions
目录下,看一下 001.phpt
里的内容.
<code class="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 源码中所有的单元测试都是这种格局.
第一个单测用例就是测一测箭头函数的根本应用是否合乎预期,非常简单,示例我就不具体阐明了.
看看箭头函数其它的用例,第二个单测文件:
<code class="phpt">--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)
也非常简单,目标是想通知咱们,定义箭头函数的时候,应用未定义的变量不会报错,只有在理论用到时才会抛出谬误。也就是说:
<code class="php"><?php $a = 1; $func = fn() => $a + $b;
这样是不会报错的,只有上面的代码才会抛出谬误。
<code class="php"><?php $a = 1; $func = fn() => $a + $b; $func();
这种细节RFC里仿佛都没有提到,只有通过单元测试代码能力留神到。
有趣味的同学能够挑几个新性能的单测看看,看完了保障你有所播种,对新性能新语法有更全面的理解。