Entrevista php-developer en 2020

Dio la casualidad de que este año pasé por una serie de entrevistas para el puesto de desarrollador PHP, lo cual no he hecho en varios años. Siendo una persona práctica y perezosa , antes de la entrevista, traté de buscar colecciones de preguntas y respuestas, pero todo lo que encontré era bastante antiguo, así que decidí preparar una lista de preguntas que me encontré.



Por lo general, los artículos de este tipo dan respuestas completas a las preguntas, pero si está entrevistando para un puesto bastante serio, obviamente un breve resumen no será suficiente y debe comprender la pregunta en sí con bastante profundidad, por lo que principalmente inserté enlaces a documentación o artículos sobre los temas descritos.



PHP



  1. Novedades de PHP 7. *
  2. Tipos de datos
  3. Indicación de tipo + modo estricto
  4. Comparación fuerte versus suelta
  5. Trabajar con enlaces
  6. Copiar en escrito
  7. Manejo de errores en tiempo de ejecución
  8. Cierres
  9. Funciones de matriz
  10. list()
  11. //
  12. Final
  13. Reflection API
  14. Autoloader
  15. SPL
  16. APC/APCu
  17. OPcache
  18. PSR standards
  19. Composer
  20. XDebug
  21. Rest API


OOP



  1. //
  2. /
  3. Traits
  4. GRASP
  5. SOLID
  6. Kiss
  7. Dry


Databases

Docker

HTTP



JS



PHP



PHP 7.*



Eh, recuerdo los momentos en los que estaba contando la diferencia entre las versiones 4 y 5, nunca vi la 4ta en mis ojos, hay que observar viejas tradiciones, la pregunta se da en casi todas las entrevistas, y aunque nadie espera que recuerdes literalmente en qué versión qué Se han producido cambios, en general, vale la pena conocer esta información:





Tipos de datos



Aunque PHP es un lenguaje dinámico, todos los datos que contiene son de distintos tipos:

Tipos escalares:



  • bool
  • En t
  • float (a veces se usa el nombre doble que para php no hace una diferencia)
  • cuerda


Tipos mixtos:

  • formación
  • objeto
  • invocable
  • iterable


Tipos especiales:



  • recurso
  • nulo


Lea más sobre tipos y pseudo-tipos en la documentación .



Indicación de tipo + modo estricto



Como continuación lógica del tema de tipos y tipificación fuerte, que vino con php 7. *, necesita conocer la diferencia entre tipificación fuerte y débil, consulte la documentación para obtener más detalles .



Comparación fuerte versus suelta



Debe comprender la diferencia entre la comparación flexible (comparación de valores sin tener en cuenta el tipo de datos) y la comparación estricta (teniendo en cuenta el tipo de datos), que esta tabla refleja bastante bien . También debemos destacar la comparación estricta y laxa de objetos .



Trabajar con enlaces



Las referencias en PHP son aproximadamente una forma de acceder a la misma variable (área de memoria) con nombres diferentes.



Las principales operaciones que se pueden realizar con enlaces:





Es importante comprender las particularidades de los objetos que pasan. Es posible que haya leído que en php todos los objetos se pasan por referencia.

bueno si, pero en realidad no



Esto era cierto antes de php5, pero ahora solo se pasa el identificador del objeto ( documentación ).

En resumen, si creó un objeto y lo pasó a una función, dentro de la cual hizo

$object = null;
esto no significa que el objeto original también se restablecerá a cero, aún puede trabajar con él. Pero si pasó explícitamente un objeto por referencia, esta acción también "pondrá a cero" el objeto original.



Copiar en escrito



Cada vez que se pasa una variable a una función, se debe copiar su valor (teóricamente). Puede que esto no sea un problema para los datos enteros o flotantes, pero imagina que estás pasando una matriz que contiene diez millones de valores a una función. Para evitar esto, PHP usa el paradigma de copia en escritura. Entonces, de hecho, cuando transfiere una matriz, su copia no ocurre hasta el momento en que no desea cambiar nada en esta matriz. Un artículo con una explicación más detallada.



Manejo de errores en tiempo de ejecución



En la séptima versión de php hubo una serie de cambios que se relacionan con la jerarquía de errores (más información sobre la jerarquía ), de lo contrario se espera que el solicitante sepa cómo detectar excepciones , o incluso pueda escribir su propio error_handler .



Cierres



También son funciones anónimas, más útiles como valores para parámetros de devolución de llamada, documentación . Hay un artículo bueno, aunque pequeño, sobre cómo trabajar con cierres en Habré .



Funciones de matriz



A menudo se le pide que nombre todas las funciones para trabajar con matrices que recuerde de la memoria. Y aunque, en mi opinión, esta pregunta es un poco más que sin sentido, la lista de funciones se puede repetir desde la documentación .



Función lista ()



Gracias a los cambios en PHP 7.1, la función se ha vuelto más conveniente de usar, como resultado, se usa con más frecuencia, toda la información se puede encontrar en la documentación .



Alcance variable



En la mayoría de los casos, todas las variables tienen un solo alcance , con la excepción de las globales / superglobales, que, como su nombre lo indica, están disponibles en todas partes, así como las estáticas / constantes.



Alcance de una propiedad / método / constante de clase



Se define usando las palabras clave público (visible para todos), protegido (disponible solo para la clase actual o sus descendientes) o privado (disponible solo para la clase actual), y se puede usar tanto para propiedades / métodos, como desde PHP 7.1 para constantes de clase. Leer más en la documentación .



Clases y métodos finales



Al colocar la palabra clave final delante de las declaraciones de métodos de clase, puede evitar que se invaliden en las clases secundarias y, si la clase en sí se declara final, no se puede heredar. Dichas clases y métodos están diseñados para proteger el código confidencial de cambios y el código en sí se vuelve más fácil de mantener.

Leer más en la documentación .



Enlace estático tardío



Expresado como la diferencia entre llamar a self :: y static ::. "Enlace tardío" significa que static :: se evaluará en tiempo de ejecución y se puede redefinir en clases derivadas. Leer más en la documentación .



Métodos mágicos



En PHP, no hay absolutamente ningún lugar sin magia, por lo que tenemos métodos que nos permiten implementar funcionalidad adicional para un objeto, anular el comportamiento estándar de un objeto (por ejemplo, __serialize () / __ unserialize ()), o el comportamiento de un objeto en situaciones atípicas (__toString ()) y otros.

Documentación y un buen artículo, aunque un poco desactualizado, sobre habr .



Variables dinámicas



Puede pasar el nombre de una variable a otra y luego usar esa variable "dinámicamente".



Deben usarse con mucho cuidado, ya que pueden complicar significativamente tanto la lectura como el mantenimiento del código (a menudo es imposible comprender qué hay en una variable sin ejecutar el código), pero pueden ser muy útiles en abstracciones. Leer más en la documentación .



Generadores



Los generadores (palabra clave de rendimiento) crean iteradores simples para ahorrar memoria en situaciones en las que necesita iterar sobre una gran cantidad de datos. Pueden ser un poco difíciles de entender justo antes de escribir su generador.



La descripción está en la documentación , y hay una bastante antigua (sin embargo, la sintaxis de los generadores no ha cambiado desde ese momento) y un buen artículo sobre Habré .



API de reflexión



En resumen, es la capacidad de mirar dentro de su propio código (o el de otra persona), averiguar qué variables, métodos, constantes tiene una clase y hacerlas públicas si lo desea. Esta capacidad es utilizada activamente por marcos (por ejemplo, en una sinfonía para la generación automática de inyección de dependencia) y bibliotecas. Descripción en la documentación y, por supuesto, un artículo sobre Habré .



Autocargador



Por lo general, en los proyectos rara vez es necesario implementar la carga automática de clases, pero para las empresas que escriben todas las soluciones por su cuenta (por ejemplo, grandes corporaciones que no quieren trabajar con código abierto), o algunos proyectos especiales, esto es relevante. También puede resultar útil comprender cómo funciona.





SPL



O Biblioteca PHP estándar: un conjunto de clases (estructuras de datos, iteradores, excepciones, clases para procesar archivos), interfaces y funciones para resolver problemas estándar. Como regla general, no se requiere conocer la biblioteca de memoria, pero comprender en qué consiste vale al menos para el desarrollo personal. Más detalles en la documentación: www.php.net/manual/ru/book.spl.php



APC / APCu



El caché PHP alternativo (APC) o el caché alternativo sin código de operación (APCu) es un caché de código abierto gratuito diseñado para almacenar en caché y optimizar el código intermedio PHP. Se utiliza principalmente para mantener los cálculos entre solicitudes. Documentación:







OPcache



Mejora el rendimiento de PHP al almacenar el código de bytes del script compilado en la memoria compartida, eliminando así la necesidad de que PHP cargue y analice los scripts en cada solicitud. Documentación oficial , así como un muy buen artículo sobre cómo funciona todo en Habré .



Estándares PSR



Recomendaciones de estándares PHP: estándares para la codificación, así como interfaces para tareas comunes. Estos estándares se utilizan en todos los marcos (que conozco) y facilitan la interacción entre diferentes bibliotecas. Documentación oficial así como un buen artículo sobre Habré .



Compositor



Administrador de dependencias , así como una herramienta que implementa la carga automática del código de la biblioteca y la propia aplicación. Puede ayudar a optimizar y acelerar su aplicación de producción.



XDebug



La mayoría de los desarrolladores usan esta extensión para facilitar el trabajo con el código o para optimizarlo, el conocimiento básico aquí es cómo configurarlo y ejecutarlo, el siguiente artículo blog.denisbondar.com/post/phpstorm_docker_xdebug ayudará con esto .



API de descanso



La transferencia de estado REpresentacional es un enfoque arquitectónico que le permite organizar la interacción entre aplicaciones utilizando todas las capacidades de HTTP. Buen artículo sobre este tema y también las diferencias entre REST y SOAP .

En el contexto de una API, debe comprender los formatos básicos de intercambio de datos, por lo general XML y JSON .



Pruebas



Todas las pruebas unitarias se basan en PHPUnit (hasta donde yo sé), y hoy en día, poder y saber escribir pruebas es una parte obligatoria del desarrollo. Muchos frameworks (como Symfony) ofrecen sus propios contenedores y soluciones de prueba. Aquí hay un buen artículo sobre las mejores herramientas de prueba .



OOP



Encapsulación / herencia / polimorfismo



  • . , , , . , . .. . ( ) . , , .
  • . , , , .
  • Polimorfismo . Esta es una propiedad que permite usar el mismo nombre para resolver varios problemas técnicamente diferentes. En términos simples, el concepto de polimorfismo es la idea de "una interfaz, muchas implementaciones". Esto significa que puede crear una interfaz común para un grupo de acciones relacionadas.


Clases / métodos abstractos



  • No implica instanciación.
  • Implementan en la práctica uno de los principios de la programación orientada a objetos: el polimorfismo.
  • Puede contener métodos y propiedades abstractos. Un método abstracto no se implementa para la clase en la que se describe, pero debe implementarse para sus descendientes no abstractos.
  • Representan las abstracciones más generales, es decir, las que tienen el mayor volumen y el menor contenido.


Matices de implementación en la documentación .



Interfaces



Una interfaz, a diferencia de una clase abstracta, no puede contener campos y métodos que tengan una implementación; solo describe las firmas de métodos que sus herederos deben implementar. A diferencia de la misma clase abstracta, una clase puede implementar muchas interfaces simultáneamente. Documentación



oficial y un buen artículo sobre Habré .



Rasgos



El rasgo es muy similar a una clase, pero está destinado a agrupar la funcionalidad y su posterior reutilización en un conjunto de clases que no se pueden vincular por una clase abstracta. También se dice a veces que un rasgo es una forma de implementar herencia múltiple en PHP.



Dado que cada clase puede implementar muchos rasgos, pueden surgir conflictos cuando el mismo método se implementa en diferentes rasgos y / o en la propia clase. Lea más sobre los rasgos en la documentación .



Plantillas GRASP



Patrones de software de asignación de responsabilidad general: patrones de diseño para resolver problemas comunes. A diferencia de los patrones de la Banda de los Cuatro, los patrones GRAPS no tienen una estructura pronunciada, un alcance claro y un problema específico que debe resolverse, sino que solo representan enfoques / recomendaciones / principios generalizados utilizados en el diseño del diseño del sistema.



Buen artículo sobre el tema - habr.com/ru/post/92570



Banda de cuatro patrones



El tema de los patrones es vasto, ya se han escrito muchos artículos sobre él y es simplemente imposible tratar de describirlo en unas pocas frases. Me gusta este recurso: refactoring.guru/ru/design-patterns/catalog , pero puede usar este enlace si es necesario .



SÓLIDO



Todos le preguntan, pero le preguntan de manera diferente.



Mala opción : se le pide que lea los principios y sus definiciones de memoria.

Bien , te dan un principio y te piden que lo expliques, describas ejemplos de uso, y que se te ocurra una situación real en la que este o aquel principio te ayudará de alguna manera. Esta opción, en mi opinión, hace que sea mucho mejor comprender el nivel del candidato y su comprensión real de los principios.



En Habré puedes encontrar docenas de artículos realmente buenos sobre estos principios, así que enlazo al medio .



Beso



Mantenlo simple, estúpido es un buen principio, cuyo punto ya está contenido en el título, puedes aprender más aquí .



Seco



No repitas el principio de que debes reutilizar tu código siempre que sea posible. Más detalles aquí .



Bases de datos



Puede encontrar un buen artículo sobre bases de datos SQL aquí . Las preguntas sobre las bases de datos NoSql en mi caso generalmente se encuentran en el ejemplo de MongoDB . En el caso de ElasticSearch, se suelen utilizar bibliotecas contenedoras, se puede encontrar información general en el artículo sobre Habré .



En los almacenamientos de memoria (los que almacenan valores en RAM) son memcached y / o redis (la mayoría de las veces), por regla general, el trabajo con ellos se realiza a través de bibliotecas contenedoras, si quieres entender el tema con más detalle, por supuesto hay un artículo sobre Habré .



Estibador



Una herramienta muy importante que se ha utilizado en casi todos los proyectos (en mi caso). Y aunque a menudo se configura una vez por proyecto, es necesario conocer los conceptos básicos y el principio para trabajar con él. Personalmente, me encanta este artículo para una entrevista de trabajo .



HTTP y otros protocolos



Por supuesto, cualquier desarrollador web debe saber y comprender cómo funcionan los protocolos de transferencia de datos (al menos los protocolos de nivel superior). El tema es extenso y es difícil encajarlo en varias oraciones, hay un extenso artículo sobre este tema en Habré .



Autorización y autenticación



La autorización es la concesión de derechos para realizar determinadas acciones, así como el proceso de verificación de derechos al intentar realizar estas acciones.



La autenticación es un procedimiento de autenticación, como verificar la identidad de un usuario comparando la contraseña ingresada por él.



Es importante comprender la diferencia entre autorización y autenticación , cómo se implementan mediante sesiones y cookies , JSON Web Tokens ( JWT ), etc.



Js



Realmente no conozco este idioma, por lo que nunca pretendo estar en posiciones en las que necesite conocer los frameworks js y ser completo, tal vez por eso para todas las entrevistas hubo suficiente conocimiento descrito en el artículo: habr.com/ru/post/486820



All Articles