星期五的PHP测验:程序员Brad的一些历险,一个奇怪的序列和奖品

你好 我们承诺-我们愿意:我们将在博客中继续针对不同编程语言的迷你测验系列(上一个: 1(关于Python,PHP,Golang和DevOps的知识)2(完全在Go上) )。 今天的发行版专门针对PHP。

在削减中-八个问题,程序员Brad的一些冒险经历,一个奇怪的序列和一个凉爽的商品作为奖品。 测验持续到7月4日。

UPD 2:按照约定,我们发布测验任务分析。 正确答案后,解释权隐藏在破坏者下方。 如果仍有问题,请在评论中提问。

UPD:我们已完成接受答案。 感谢所有参加的人! 我们正在准备任务审查。 答案在正文中,获奖者和获奖者都在剧透之下。
PHP测验的优胜者

优胜者


egor_nullptr

获奖者


我们随机选择了十个最佳参与者,他们在答案中的错误不超过两个: Dimd13slimusalexchrometsDonquih0teTexEllessSamDarkAdmAlexusvoicenonoiseRaz-MikSerj_By

抽奖记录


加分


对于只犯了一个错误的人,我们另外提供了holivny bones,您可以用它决定使用哪种后端语言和前端框架来编写新项目或重新构建旧项目。 它们被接收到: DjSebasTexEllessTurik-usofflinewanvoiceofnoiseandrey_96全能的




游戏规则


我们会将Avito纪念品套件发送给一个会正确回答的人:一件带有php大象,袜子和and骨头的T恤(可以猜测您的新项目将使用哪种后端语言和前端框架编写)。

我们将把 Avito袜子发送给其他十个回答正确的人 。 让我们在随机发生器的帮助下玩。 他将确定谁去再穿两件T恤和一套骨头。



问题和答案选项


问题1


代码将输出什么:

<?php $a = [1, 2, 3]; foreach($a as &$value) {} foreach($a as $value) {} print_r($a); 

答案选项:

  1. 数组(1、2、3)
  2. 数组(1、2、2)
  3. 数组(3,2,1)
  4. 失误

正确答案
数组(1、2、2)

解说
由于在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(); 

答案选项:

  1.   0 => flour 1 => wheat 

  2.   0 => wheat 1 => flour 2 => cupcake 

  3.  0 => flour 1 => wheat cupcake 

  4.  cupcake 



正确答案
4。
 0 => flour 1 => wheat cupcake 



解说
暂无评论 生成器只是一个棘手的例子。

问题3


有一次,程序员Brad决定将一个库从Go移植到PHP以在GitHub上收集星标,并想知道:

以下构造可行吗?

 <?php print_r(...(new Foo())); 

答案选项:

  1. 是的,Foo类必须实现Traversable接口
  2. 是的,Foo类必须实现ArrayAccess接口方法
  3. 不,会有错误,...-运算符的参数必须是数组

正确答案
1.是的,Foo类必须实现Traversable接口

解说
这里的一切都很简单。 从参数解压缩文档中
使用运算符传递给函数时,可以将实现Traversable接口的数组和对象解压缩到参数列表中。


问题4


PHP的心脏中对排序等功能使用了哪种排序算法?

答案选项:

  1. 非递归合并排序
  2. 堆排序(Edsger Dijkstra smoothsort的变体)
  3. quicksort中位数为三
  4. 内省型

正确答案
4.内省

解说
由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返回值之间有区别吗?

答案选项:

  1. 在一种情况下,使用static :)关键字,但不影响
  2. getLambda2()的结果不能绑定到任何对象
  3. 所以你不能这样写:将会出现语法错误“语法错误:在错误的上下文中使用了静态关键字”
  4. 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); 

答案选项:

  1.  bool(false) bool(false) 
  2.  bool(false) bool(true) 
  3.  bool(true) bool(true) 
  4.  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; } 

答案选项:

  1. 将显示从0到39的数字,以及警告:每次迭代中遇到的非数字值
  2. 每次迭代将输出“ a” +警告
  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 

正确答案
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.  1 2 3 32332 The end 

  2.  1 2 3 The end 

  3.  The end 

  4.  32332 The end 


正确答案
3。
 The end 



解说
乍看起来,该函数似乎未返回生成器,因为yield表达式不可访问。 但是,任何包含 yield表达式的函数都会自动成为生成器函数。 原始RFC 这样说的 。 在第一次迭代时,生成器从最开始到第一个可用的yield表达式开始执行功能代码,但是由于它不存在,因此生成器完成了工作,而没有将任何数据传输到循环中。

总结


我们将在7月4日(星期三)更新该帖子,以发布问题的答案 。 如果您决定-将答案放在破坏者的下面,以免破坏他人的乐趣。 测验结束后,别忘了检查Habr的帐户。

好好享受

Source: https://habr.com/ru/post/zh-CN414481/


All Articles