你好 我们承诺-我们愿意:我们将在博客中继续针对不同编程语言的迷你测验系列(上一个:
1(关于Python,PHP,Golang和DevOps的知识) ,
2(完全在Go上) )。 今天的发行版专门针对PHP。
在削减中-八个问题,程序员Brad的一些冒险经历,一个奇怪的序列和一个凉爽的商品作为奖品。 测验持续到7月4日。
UPD 2:按照约定,我们发布测验任务分析。 正确答案后,解释权隐藏在破坏者下方。 如果仍有问题,请在评论中提问。
UPD:我们已完成接受答案。 感谢所有参加的人! 我们正在准备任务审查。 答案在正文中,获奖者和获奖者都在剧透之下。

游戏规则
我们会将Avito纪念品套件发送给
第一个会正确回答的人:一件带有php大象,袜子和and骨头的T恤(可以猜测您的新项目将使用哪种后端语言和前端框架编写)。
我们将把 Avito袜子发送给
其他十个回答正确的人 。 让我们在随机发生器的帮助下玩。 他将确定谁去再穿两件T恤和一套骨头。

问题和答案选项
问题1
代码将输出什么:
<?php $a = [1, 2, 3]; foreach($a as &$value) {} foreach($a as $value) {} print_r($a);
答案选项:- 数组(1、2、3)
- 数组(1、2、2)
- 数组(3,2,1)
- 失误
解说由于在php中,在循环中创建的变量在完成后仍保持活动状态,因此在第二个循环开始时,$ value变量是对数组最后一个元素的引用。 在最后一个foreach的迭代过程中,数组中的值被写入其最后一个元素(因为$ value是一个引用)。 在第二个循环的每次迭代中,它将看起来像一个数组:
1. [1、2、1]
2. [1、2、2]
3. [1、2、2]
问题2
代码将输出什么:
<?php function sowCrops() { return 'wheat'; } function millWheat() { return 'flour'; } function bake($flour) { return 'cupcake'; } function generator() { $flour = yield millWheat(); $wheat = yield sowCrops(); return bake($flour); }; $gen = generator(); foreach ($gen as $key => $value) { echo $key . ' => ' . $value . PHP_EOL; } echo $gen->getReturn();
答案选项: 0 => flour 1 => wheat
0 => wheat 1 => flour 2 => cupcake
0 => flour 1 => wheat cupcake
cupcake
正确答案4。
0 => flour 1 => wheat cupcake
问题3
有一次,程序员Brad决定将一个库从Go移植到PHP以在GitHub上收集星标,并想知道:
以下构造可行吗?
<?php print_r(...(new Foo()));
答案选项:- 是的,Foo类必须实现Traversable接口
- 是的,Foo类必须实现ArrayAccess接口方法
- 不,会有错误,...-运算符的参数必须是数组
正确答案1.是的,Foo类必须实现Traversable接口
解说这里的一切都很简单。 从参数解压缩
文档中 :
使用运算符传递给函数时,可以将实现Traversable接口的数组和对象解压缩到参数列表中。
问题4
PHP的心脏中对排序等功能使用了哪种排序算法?
答案选项:- 非递归合并排序
- 堆排序(Edsger Dijkstra smoothsort的变体)
- quicksort中位数为三
- 内省型
解说由introsort使用。 可以在
Github上查看源代码。 文档中提到了快速排序的使用,但是这里没有矛盾,因为内向排序是一种混合排序算法,其中插入排序用于少量元素,后来使用了更快的算法:快速排序或堆排序。
问题5
有一个代码:
<?php class Factory { public function getLambda(): Closure { return function () { printf("Here I am (%s)!\n", get_class($this)); }; } public function getLambda2(): Closure { return static function () { printf("Here I am (%s)!\n", get_class($this)); }; } }
问题:getLambda和getLambda2返回值之间有区别吗?
答案选项:- 在一种情况下,使用static :)关键字,但不影响
- getLambda2()的结果不能绑定到任何对象
- 所以你不能这样写:将会出现语法错误“语法错误:在错误的上下文中使用了静态关键字”
- getLamda2()的闭包只能绑定(bindTo)到类
正确答案2. getLambda2()的结果不能绑定到任何对象
解说getLambda2()方法返回无法通过-> bindTo()方法绑定到对象的静态匿名函数。 在代码中很少使用它们,但是仍然
问题6
代码将输出什么:
<?php $a = true; $b = false; $c = $a and $b; $d = $a && $b; var_dump($c); var_dump($d);
答案选项: bool(false) bool(false)
bool(false) bool(true)
bool(true) bool(true)
bool(true) bool(false)
正确答案4。
bool(true) bool(false)
解说&&和和优先级之间的区别。 表达式$ d = $ a && $ b的作用类似于$ d =($ a && $ b)。 但是表达式$ c = $ a和$ b的工作方式不同,可以表示为(($ c = $ a)和$ b)。
问题7
代码将输出什么:
<?php $a = 'a'; for ($i = 0; $i < 40; $i++) { echo $a++, PHP_EOL; }
答案选项:- 将显示从0到39的数字,以及警告:每次迭代中遇到的非数字值
- 每次迭代将输出“ a” +警告
- 奇怪的顺序:
a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an
正确答案3.奇怪的顺序:
a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an
解说并非所有人都知道,但是可以将增量运算符应用于字符。 从文档中:
PHP遵循Perl约定(相对于C),该约定涉及使用字符变量进行算术运算。 例如,在PHP和Perl中,$ a ='Z'; $ ++; 将$ a设置为“ AA”,而在C中将a设置为“ Z”; ++; 为“ [”分配一个值(“ Z”的ASCII值为90,而“ [”的ASCII值为91)。
问题8
代码将输出什么:
<?php class TestMe { public function test() { if (0) { yield 32332; } return [1,2,3]; } } $t = new TestMe(); foreach ($t->test() as $id) { echo $id, PHP_EOL; } echo "The end", PHP_EOL;
答案选项: 1 2 3 32332 The end
1 2 3 The end
The end
32332 The end
解说乍看起来,该函数似乎未返回生成器,因为yield表达式不可访问。 但是,任何
包含 yield表达式的函数都会自动成为生成器函数。 原始RFC
是这样
说的 。 在第一次迭代时,生成器从最开始到第一个可用的yield表达式开始执行功能代码,但是由于它不存在,因此生成器完成了工作,而没有将任何数据传输到循环中。
总结
我们将在7月4日(星期三)更新该帖子,以发布问题的答案 。 如果您决定-将答案放在破坏者的下面,以免破坏他人的乐趣。 测验结束后,别忘了检查Habr的帐户。
好好享受