php开发人员在2020年的采访

碰巧的是,今年我接受了一系列有关PHP开发人员职位的面试,而这已经有好几年了。作为一个懒惰而又务实的,在面试之前,我试图找到问题和答案的集合,但是发现的一切都很古老,所以我决定准备一份自己遇到的问题的清单。



通常,此类文章可以完整地回答问题,但是如果您面试一个相当严肃的职位,则简短的摘要显然显然不够,您需要相当深入地理解问题本身,因此我主要插入了有关所描述问题的文档或文章的链接。



的PHP



  1. PHP 7的新功能*
  2. 资料类型
  3. 输入提示+严格模式
  4. 强对比松
  5. 使用链接
  6. 写时复制
  7. 运行时错误处理
  8. 关闭
  9. 数组功能
  10. List()函数
  11. 可变范围
  12. 属性/方法/类常量的范围
  13. 期末课程和方法
  14. 后期静态链接
  15. 魔术方法
  16. 动态变量
  17. 发电机
  18. 反射API
  19. 自动装带器
  20. 声压级
  21. APC / APCu
  22. OP缓存
  23. PSR标准
  24. 作曲家
  25. XDebug
  26. REST API
  27. 测验


面向对象



  1. 封装/继承/多态
  2. 抽象类/方法
  3. 介面
  4. 特质
  5. GRASP模板
  6. 四种模式的帮派
  7. 固体


数据库

Docker

HTTP和其他协议JS

授权和认证





的PHP



PHP 7的新功能*



恩,我记得当我讲第4版和第5版之间的区别时,我从来没有看过第4版,必须遵守旧的传统,这个问题几乎发生在所有采访中,尽管没人希望您从字面上记住哪个版本发生了更改,通常,此信息值得了解:





资料类型



尽管PHP是一种动态语言,但其中的所有数据都是不同的类型:

标量类型:



  • 布尔
  • 整型
  • 浮动(有时会找到名称double,这对于php并没有影响)


混合类型:

  • 数组
  • 目的
  • 可召回的
  • 可迭代的


特殊类型:



  • 资源
  • 空值


文档中阅读有关类型和伪类型的更多信息



输入提示+严格模式



作为php 7 *中附带的类型和强类型化主题的逻辑上的延续,您需要了解强类型和松散类型之间的区别,有关详细信息,请参阅文档



强对比松



您需要了解松散比较(不考虑数据类型的值比较)和严格比较(考虑数据类型)之间的区别,此表很好地反映了这一点我们还应该强调对象的严格和松散的比较



使用链接



粗略地说,PHP中的引用是一种使用不同名称访问相同变量(内存区域)的方法。



可以通过链接执行的主要操作:





了解传递对象的细节很重要。您可能已经读过,在php中所有对象都是通过引用传递的。

是的,但实际上没有



在php5之前是正确的,但是现在仅传递对象标识符(文档)。

简而言之,如果您创建了一个对象,并将其传递给函数,则在其中执行了

$object = null;
这并不意味着原始对象也将被清零,您仍然可以使用它。但是,如果您通过引用显式传递了一个对象,则此操作也将原始对象“置零”。



写时复制



每次将变量传递给函数时,(理论上)应复制其值。对于整数或浮点数据来说这可能不是问题,但是假设您正在将包含一千万个值的数组传递给函数。为了避免这种情况,PHP使用了写时复制范例。因此,实际上,当您传输阵列时,直到您不想更改该阵列中的任何内容时才进行复制。带有更详细说明的文章



运行时错误处理



在php的第7版中,进行了许多与错误层次结构相关的更改(有关层次结构的更多信息),否则,要求申请人知道如何捕获异常,甚至可以编写自己的error_handler



关闭



它们也是匿名函数,最可用作回调参数,文档的尽管在Habré中有一篇有关处理闭包的老文章,但有一篇不错的文章



数组功能



通常会要求命名所有用于记忆的数组的函数。而且,尽管我认为这个问题比没有意义的多,但功能列表可以在文档中重复



List()函数



由于PHP 7.1的更改,该功能变得更加方便使用,因此,它的使用频率更高,所有信息都可以在文档中找到



可变范围



在大多数情况下,所有变量都只有一个作用域,全局/超全局变量除外,顾名思义,全局/超全局变量以及静态/常量均可用。



属性/方法/类常量的范围



它是使用关键字public(对所有人可见),protected(仅对当前类或其后代可用)或private(仅对当前类可用)定义的,并且可用于属性/方法以及自PHP 7.1起用于类常量。文档中阅读更多内容



期末课程和方法



通过将final关键字放在类方法声明的前面,可以防止它们在子类中被覆盖,并且如果类本身被声明为final,则不能继承它。这些类和方法旨在保护敏感代码免受更改,并且代码本身变得更易于维护。

文档中阅读更多内容



后期静态链接



表示为调用self ::和static ::之间的差异。“后期绑定”表示静态::将在运行时求值,并且可以在派生类中重新定义。文档中阅读更多内容



魔术方法



在PHP中,绝对没有魔咒,因此我们有一些方法可以让我们实现对象的附加功能,覆盖对象的标准行为(例如__serialize()/ __ unserialize())或非典型情况下对象的行为(__toString())和其他。

文档,以及关于habr的一篇不错的文章,尽管有些过时



动态变量



您可以将一个变量的名称传递给另一个变量,然后“动态”使用该变量。



使用它们时应格外小心,因为它们会使阅读和维护代码都大大复杂化(在不运行代码的情况下,通常无法理解变量中的内容),但是它们在抽象中非常有用。文档中阅读更多内容



发电机



生成器(yield关键字)创建简单的迭代器,以在需要迭代大量数据的情况下节省内存。在编写生成器之前,要理解它们可能有些棘手。



描述在文档中,并且有一个相当古老的描述(但是,从那一刻起,生成器的语法就没有改变过),并且在Habré上有一篇不错的文章



反射API



简而言之,它具有查看您自己(或他人)代码的能力,找出类具有的变量,方法,常量并在需要时将其公开的能力。框架(例如,在自动生成依赖项注入的交响曲中)和库中积极使用此功能。文档中的描述,当然还有有关Habré的文章



自动装带器



通常,在项目上很少需要自己实现类的自动加载,但是对于自行编写所有解决方案的公司(例如,不想使用开源的大型公司)或某些特殊项目而言,这是相关的。了解其工作原理也可能会有所帮助。





声压级



或Standart PHP库-一组类(数据结构,迭代器,异常,用于处理文件的类),用于解决标准问题的接口和函数。通常,不需要完全了解图书馆,但至少对于个人发展而言,了解图书馆的内容是值得的。文档中有更多详细信息-www.php.net/manual/ru/book.spl.php



APC / APCu



备用PHP缓存(APC)或无操作码的备用缓存(APCu)是一种免费的开源缓存,旨在缓存和优化PHP中间代码。它主要用于保持请求之间的计算。说明文件:







OP缓存



通过将编译后的脚本字节码存储在共享内存中来提高PHP性能,从而消除了PHP在每个请求上加载和解析脚本的需求。官方文档,以及有关如何在Habré上运行的非常好的文章



PSR标准



PHP Standards Recommendations-编码标准以及常见任务的接口。这些标准用于所有(对我来说都是已知的)框架中,并促进不同库之间的交互。官方文档以及有关Habré的精彩文章



作曲家



依赖性管理器,以及实现库代码和应用程​​序本身的自动加载工具可能有助于优化和加快您的生产应用程序



XDebug



大多数开发人员都使用此扩展名,以使其更易于使用代码或对其进行优化,这里的基本知识是如何配置和运行它,以下文章blog.denisbondar.com/post/phpstorm_docker_xdebug将对此提供帮助



REST API



代表性状态转移是一种体系结构方法,允许您使用HTTP的所有功能来组织应用程序之间的交互。关于这个主题的好文章,以及REST和SOAP之间的区别

在API的上下文中,您需要了解基本的数据交换格式,最常见的是XMLJSON



测验



所有单元测试都基于PHPUnit(据我所知),如今,能够并且知道如何编写测试是开发的必不可少的部分。许多框架(例如Symfony)都提供了自己的包装器和测试解决方案。这是一篇有关最佳测试工具的好文章



面向对象



封装/继承/多态



  • . , , , . , . .. . ( ) . , , .
  • . , , , .
  • 多态性此属性允许使用一个相同的名称来解决几个技术上不同的问题。简而言之,多态性的概念是``一个接口,很多实现''的想法。这意味着您可以为一组相关操作创建一个公共界面。


抽象类/方法



  • 不涉及实例化。
  • 它们在实践中实现了OOP的原理之一-多态性。
  • 可能包含抽象方法和属性。没有为所描述的类实现抽象方法,但必须为其非抽象后代实现抽象方法。
  • 它们代表最通用的抽象,即具有最大的数量和最少的内容。


文档中的 实现细节



介面



与抽象类不同,接口不能包含具有实现的字段和方法-它仅描述其继承者必须实现的方法签名。与同一个抽象类不同,一个类可以同时实现许多接口。



官方文档,以及有关Habré的精彩文章



特质



该特征与一个类非常相似,但是它旨在对功能进行分组,并在不能由一个抽象类链接的一组类中进一步复用它。有时也有人说,特征是一种在PHP中实现多重继承的方法。



由于每个类可以实现许多特征,因此,如果在不同的特征和/或类本身中实现相同的方法,则可能会发生冲突。文档中阅读有关特征的更多信息



GRASP模板



一般责任分配软件模式-解决常见问题的设计模式。与“四人帮”模式不同,GRAPS模式没有明确的结构,明确的范围和要解决的特定问题,而仅表示系统设计中使用的通用方法/建议/原则。



关于该主题的好文章-habr.com/ru/post/92570



四种模式的帮派



模式的主题很广,已经写了很多文章,要用几句话来描述它根本是不可能的。我喜欢这样的资源- refactoring.guru/ru/design-patterns/catalog,但你可以使用这个链接,如果必要的



固体



每个人都问他,但是他们问他的方式有所不同。



错误的选择-要求您从内存中读取原理及其定义。

很好-他们告诉您一个原则,并请您解释该原则,描述使用示例,并提出一个实际情况,说明该原则或那个原则在某种程度上会有所帮助。我认为,该选项可以更好地了解候选人的水平以及他对原则的真实理解。



在Habré上,您可以找到许多有关这些原则的非常好的文章,因此,我链接到medium





保持简单,愚蠢是一个很好的原则,其全部内容已包含在标题中,您可以在此处了解更多信息





不要重复自己-尽可能重用代码的原则。更多细节在这里



资料库



可以在这里找到有关SQL数据库的好文章在我的情况下,有关NoSql数据库的问题通常可以在MongoDB的示例中找到对于ElasticSearch,通常使用包装器库,有关常规信息,请参见Habré上的文章



通常,在内存存储(那些将值存储在RAM中的存储)和/或Redis(通常)中进行内存缓存和/或Redis操作是通过包装器库进行的,如果您想更详细地了解此问题,那么当然会在Habré上发表文章



码头工人



一个非常重要的工具已在几乎所有项目中使用(以我为例)。而且,尽管通常每个项目对它进行一次配置,但是您需要了解基本概念和使用它的原理。就个人而言,我喜欢这篇求职面试的文章



HTTP和其他协议



当然,任何Web开发人员都应该了解并理解数据传输协议(至少是顶级协议)如何工作。该主题很大,很难将其分成几句话,有关此主题的大量文章在Habré上发表



授权与认证



授权是授予执行某些操作的权限,以及在尝试执行这些操作时验证权限的过程。



身份验证是一种身份验证过程,例如通过比较用户输入的密码来验证用户的身份。



重要的是要了解授权和身份验证之间的区别,如何使用会话和cookie以及JSON Web令牌(JWT来实现它们



s



我并不是真的不懂这种语言,所以我从不假装自己是需要了解js框架和全栈的职位,也许这就是为什么所有采访中文章中都描述了足够的知识-habr.com/ru/post/486820



All Articles