Entretien avec Php-Developer en 2020

Il se trouve que cette année je suis passé par une série d'entretiens pour le poste de développeur PHP, ce que je n'ai pas fait depuis plusieurs années. Étant une personne pratique paresseuse , avant l'entrevue, j'ai essayé de trouver des collections de questions et de réponses, mais tout ce que j'ai trouvé était plutôt ancien, alors j'ai décidé de préparer une liste de questions que je me suis rencontrée.



Habituellement, les articles de ce type donnent des réponses complètes aux questions, mais si vous interviewez pour un poste assez sérieux, un bref résumé ne suffira évidemment pas et vous devez comprendre la question elle-même assez profondément, j'ai donc principalement inséré des liens vers de la documentation ou des articles sur les problèmes décrits.



PHP



  1. Quoi de neuf dans PHP 7. *
  2. Types de données
  3. Indication de type + mode strict
  4. Comparaison forte et lâche
  5. Travailler avec des liens
  6. Copie sur écriture
  7. Gestion des erreurs d'exécution
  8. Fermetures
  9. Fonctions de tableau
  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, je me souviens des moments où je vous ai dit quelle est la différence entre les versions 4 et 5, ne jamais voir la 4e à mes yeux, les anciennes traditions doivent être respectées, la question se pose dans presque toutes les interviews, et bien que personne ne s'attende à ce que vous vous rappeliez littéralement quelle des changements sont survenus, en général, cette information vaut la peine d'être connue:





Types de données



Bien que PHP soit un langage dynamique, toutes les données qu'il

contient sont de types distincts: Types scalaires:



  • booléen
  • int
  • float (parfois le nom double est utilisé, ce qui pour php ne fait aucune différence)
  • chaîne


Types mixtes:

  • tableau
  • objet
  • appelable
  • itérable


Types spéciaux:



  • Ressource
  • nul


En savoir plus sur les types et pseudo-types dans la documentation .



Indication de type + mode strict



En tant que suite logique du sujet des types et du typage fort, fourni avec php 7. *, vous devez connaître la différence entre le typage fort et faible, voir la documentation pour plus de détails .



Comparaison forte et lâche



Vous devez comprendre la différence entre une comparaison lâche (comparaison des valeurs sans égard au type de données) et une comparaison stricte (en tenant compte du type de données), ce que ce tableau reflète assez bien . Nous devons également souligner la comparaison stricte et lâche des objets .



Travailler avec des liens



Les références en PHP sont à peu près un moyen d'accéder à la même variable (zone mémoire) sous des noms différents.



Les principales opérations pouvant être effectuées avec des liens:





Il est important de comprendre les spécificités des objets qui passent. Vous pouvez lire qu'en php tous les objets sont passés par référence.

eh bien oui, mais en fait non



C'était vrai avant php5, mais maintenant seul l'identifiant d'objet est passé ( documentation ).

En bref, si vous avez créé un objet et l'avez passé à une fonction, à l'intérieur de laquelle vous l'avez fait

$object = null;
cela ne signifie pas que l'objet d'origine sera également mis à zéro, vous pouvez toujours travailler avec. Mais si vous avez explicitement passé un objet par référence, alors cette action «remettra à zéro» l'objet d'origine également.



Copie sur écriture



Chaque fois qu'une variable est passée à une fonction, sa valeur (en théorie) doit être copiée. Cela peut ne pas poser de problème pour les données entières ou flottantes, mais imaginez que vous transmettez un tableau contenant dix millions de valeurs à une fonction. Pour éviter cela, PHP utilise le paradigme de la copie sur écriture. Donc, en fait, lorsque vous transférez un tableau, sa copie n'a lieu qu'au moment où vous ne voulez rien changer dans ce tableau. Un article avec une explication plus détaillée.



Gestion des erreurs d'exécution



Dans la 7ème version de php, il y avait un certain nombre de changements liés à la hiérarchie des erreurs (plus d'informations sur la hiérarchie ), sinon le candidat devrait savoir comment attraper les exceptions , ou même être capable d'écrire son propre error_handler .



Fermetures



Ce sont aussi des fonctions anonymes, les plus utiles comme valeurs pour les paramètres de rappel, la documentation . Il y a un bon, mais un petit article ancien sur le travail avec les fermetures à Habré .



Fonctions de tableau



Souvent demandé de nommer toutes les fonctions permettant de travailler avec des tableaux dont vous vous souvenez de mémoire. Et bien que, à mon avis, cette question soit un peu plus que dénuée de sens, la liste des fonctions peut être répétée à partir de la documentation .



Fonction List ()



Grâce aux changements de PHP 7.1, la fonction est devenue plus pratique à utiliser, par conséquent, elle est utilisée plus souvent, toutes les informations peuvent être trouvées dans la documentation .



Portée variable



Dans la plupart des cas, toutes les variables n'ont qu'une seule portée , à l'exception des globales / superglobales, qui, comme son nom l'indique, sont disponibles partout, ainsi que des statiques / constantes.



Portée d'une propriété / méthode / constante de classe



Il est défini à l'aide des mots-clés public (visible par tous), protected (disponible uniquement pour la classe courante ou ses descendants) ou private (disponible uniquement pour la classe courante), et peut être utilisé à la fois pour les propriétés / méthodes et depuis PHP 7.1 pour les constantes de classe. En savoir plus dans la documentation .



Classes et méthodes finales



En plaçant le mot clé final devant les déclarations de méthode de classe, vous pouvez éviter qu'elles ne soient remplacées dans les classes enfants, et si la classe elle-même est déclarée finale, elle ne peut pas être héritée. Ces classes et méthodes sont conçues pour protéger le code sensible des modifications, et le code lui-même devient plus facile à maintenir.

En savoir plus dans la documentation .



Liaison statique tardive



Exprimé comme la différence entre l'appel de self :: et static ::. "Late binding" signifie que static :: sera évalué à l'exécution et peut être redéfini dans les classes dérivées. En savoir plus dans la documentation .



Méthodes magiques



En PHP, il n'y a absolument nulle part sans magie, nous avons donc des méthodes qui nous permettent d'implémenter des fonctionnalités supplémentaires pour un objet, de remplacer le comportement standard d'un objet (par exemple, __serialize () / __ unserialize ()), ou le comportement d'un objet dans des situations atypiques (__toString ()) et autres.

De la documentation et un bon article sur habr .



Variables dynamiques



Vous pouvez passer le nom d'une variable à une autre puis utiliser cette variable «dynamiquement».



Ils doivent être utilisés avec beaucoup de précautions, car ils peuvent compliquer considérablement la lecture et la maintenance du code (il est souvent impossible de comprendre ce qu'il y a dans une variable sans exécuter le code), mais ils peuvent être très utiles dans les abstractions. En savoir plus dans la documentation .



Générateurs



Les générateurs (mot-clé yield) créent des itérateurs simples pour économiser de la mémoire dans les situations où vous devez itérer sur une grande quantité de données. Ils peuvent être un peu difficiles à comprendre juste avant d'écrire votre générateur.



La description est dans la documentation , et il y en a une assez ancienne (cependant, la syntaxe des générateurs n'a pas changé depuis ce moment) et un bon article sur Habré .



API de réflexion



En bref, c'est la possibilité de regarder dans votre propre code (ou celui de quelqu'un d'autre), de découvrir les variables, méthodes, constantes d'une classe et de les rendre publiques si vous le souhaitez. Cette capacité est activement utilisée par les frameworks (par exemple, dans une symphonie pour l'auto-génération d'injection de dépendances) et les bibliothèques. Description dans la documentation et, bien sûr, un article sur Habré .



Chargeur automatique



Habituellement, sur les projets, il est très rarement nécessaire d'implémenter vous-même le chargement automatique des classes, mais pour les entreprises qui écrivent toutes les solutions elles-mêmes (par exemple, les grandes entreprises qui ne veulent pas travailler avec l'open source), ou certains projets spéciaux, c'est pertinent. Il peut également être utile de comprendre comment cela fonctionne.





SPL



Ou Bibliothèque PHP Standart - un ensemble de classes (structures de données, itérateurs, exceptions, classes pour le traitement de fichiers), interfaces et fonctions pour résoudre des problèmes standard. En règle générale, connaître la bibliothèque par cœur n'est pas nécessaire, mais comprendre en quoi elle consiste vaut au moins pour le développement personnel. Plus de détails dans la documentation - www.php.net/manual/ru/book.spl.php



APC / APCu



Le cache PHP alternatif (APC) ou le cache alternatif sans opcode (APCu) est un cache open source gratuit conçu pour la mise en cache et l'optimisation du code intermédiaire PHP. Il est principalement utilisé pour sauvegarder les calculs entre les requêtes. Documentation:







OPcache



Améliore les performances PHP en stockant le bytecode de script compilé dans la mémoire partagée, éliminant ainsi la nécessité pour PHP de charger et d'analyser des scripts à chaque demande. Documentation officielle , ainsi qu'un très bon article sur le fonctionnement de tout cela sur Habré .



Normes PSR



Recommandations de normes PHP - normes de codage, ainsi que des interfaces pour les tâches courantes. Ces standards sont utilisés dans tous les frameworks (connus de moi) et facilitent les interactions entre les différentes bibliothèques. Documentation officielle ainsi qu'un bon article sur Habré .



Compositeur



Gestionnaire de dépendances , ainsi qu'un outil qui implémente le chargement automatique du code de la bibliothèque et de l'application elle-même. Peut vous aider à optimiser et à accélérer votre application de production.



XDebug



La plupart des développeurs utilisent cette extension pour faciliter le travail avec le code ou pour l'optimiser, les connaissances de base ici sont comment le configurer et l'exécuter, l'article suivant blog.denisbondar.com/post/phpstorm_docker_xdebug vous y aidera .



API Rest



REpresentational State Transfer est une approche architecturale qui vous permet d'organiser l'interaction entre les applications en utilisant toutes les capacités de HTTP. Bon article sur ce sujet et aussi les différences entre REST et SOAP .

Dans le contexte d'une API, vous devez comprendre les formats d'échange de données de base, le plus souvent XML et JSON .



Des tests



Tous les tests unitaires sont basés sur PHPUnit (pour autant que je sache), et aujourd'hui, être capable et savoir écrire des tests est une partie obligatoire du développement. De nombreux frameworks (comme Symfony) proposent leurs propres wrappers et solutions de test. Voici un bon article sur les meilleurs outils de test .



POO



Encapsulation / héritage / polymorphisme



  • . , , , . , . .. . ( ) . , , .
  • . , , , .
  • Polymorphisme . Il s'agit d'une propriété qui permet d'utiliser le même nom pour résoudre plusieurs problèmes techniquement différents. En termes simples, le concept de polymorphisme est l'idée «d'une interface, de nombreuses implémentations». Cela signifie que vous pouvez créer une interface commune pour un groupe d'actions associées.


Classes / méthodes abstraites



  • N'implique pas d'instanciation.
  • Ils mettent en œuvre en pratique l'un des principes de la POO - le polymorphisme.
  • Peut contenir des méthodes et des propriétés abstraites. Une méthode abstraite n'est pas implémentée pour la classe dans laquelle elle est décrite, mais doit être implémentée pour ses descendants non abstraits.
  • Ils représentent les abstractions les plus générales, c'est-à-dire ayant le plus grand volume et le moins de contenu.


Nuances de mise en œuvre dans la documentation .



Interfaces



Une interface, contrairement à une classe abstraite, ne peut pas contenir de champs et de méthodes qui ont une implémentation - elle décrit uniquement les signatures de méthode que ses héritiers doivent implémenter. Contrairement à la même classe abstraite, une classe peut implémenter plusieurs interfaces simultanément. Documentation



officielle , et un bon article sur Habré .



Traits



Le trait est très similaire à une classe, mais il est destiné au regroupement de fonctionnalités et à sa réutilisation ultérieure dans un ensemble de classes qui ne peuvent pas être liées par une classe abstraite. On dit aussi parfois qu'un trait est un moyen d'implémenter l'héritage multiple en PHP.



Comme chaque classe peut implémenter de nombreux traits, des conflits peuvent survenir lorsque la même méthode est implémentée dans différents traits et / ou dans la classe elle-même. En savoir plus sur les traits dans la documentation .



Modèles GRASP



Modèles de logiciels d'attribution de responsabilité générale - modèles de conception pour résoudre les problèmes courants. Contrairement aux modèles du groupe des quatre, les modèles GRAPS n'ont pas une structure prononcée, une portée claire et un problème spécifique à résoudre, mais ne représentent que des approches / recommandations / principes généralisés utilisés dans la conception du système.



Un bon article sur le sujet - habr.com/ru/post/92570



Groupe de quatre modèles



Le sujet des patterns est vaste, de nombreux articles y ont déjà été écrits, et il est tout simplement impossible d'essayer de le décrire en quelques phrases. J'aime cette ressource - refactoring.guru/ru/design-patterns/catalog , mais vous pouvez utiliser ce lien si nécessaire .



SOLIDE



Tout le monde le lui demande, mais ils lui demandent différemment.



Mauvaise option - on vous demande de lire les principes et leurs définitions de mémoire.

Bien - ils vous disent un principe et vous demandent de l'expliquer, de décrire des exemples d'utilisation, de proposer une situation réelle où tel ou tel principe aidera d'une manière ou d'une autre. Cette option, à mon avis, permet de mieux comprendre le niveau du candidat et sa réelle compréhension des principes.



Sur Habré, vous pouvez trouver des dizaines de très bons articles sur ces principes, donc je crée un lien vers medium .



Baiser



Restez simple, stupide est un bon principe, dont tout le point est déjà contenu dans le titre, vous pouvez en savoir plus ici .



Sec



Ne vous répétez pas - le principe selon lequel vous devez réutiliser votre code dans la mesure du possible. Plus de détails ici .



Bases de données



Un bon article sur les bases de données SQL peut être trouvé ici . Les questions sur les bases de données NoSql dans mon cas se trouvent généralement sur l'exemple de MongoDB . Dans le cas d'ElasticSearch, les bibliothèques de wrapper sont généralement utilisées, des informations générales peuvent être obtenues à partir de l'article sur Habré .



En mémoire, les stockages (ceux qui stockent les valeurs dans la RAM) sont memcached et / ou redis (le plus souvent), en règle générale, le travail avec eux est effectué via des bibliothèques de wrapper, si vous voulez comprendre le problème plus en détail, il y a bien sûr un article sur Habré .



Docker



Un outil très important qui a été utilisé sur presque tous les projets (dans mon cas). Et bien qu'il soit souvent configuré une fois par projet, vous devez connaître les concepts de base et le principe de son utilisation. Personnellement, j'adore cet article pour un entretien d'embauche .



HTTP et autres protocoles



Bien entendu, tout développeur Web doit connaître et comprendre le fonctionnement des protocoles de transfert de données (au moins les protocoles de haut niveau). Le sujet est vaste et il est difficile de le mettre en plusieurs phrases, il existe un article complet sur ce sujet sur Habré .



Autorisation et authentification



L'autorisation est l'octroi de droits pour effectuer certaines actions, ainsi que le processus de vérification des droits lorsque vous essayez d'exécuter ces actions.



L'authentification est une procédure d'authentification, telle que la vérification de l'identité d'un utilisateur en comparant le mot de passe saisi par lui.



Il est important de comprendre la différence entre l' autorisation et l'authentification , comment elles sont implémentées à l'aide de session et de cookies , de jetons Web JSON ( JWT ), etc.



Js



Je ne connais pas vraiment cette langue, donc je ne prétends jamais être des postes où vous devez connaître les frameworks js et être full-stack, c'est peut-être pourquoi pour toutes les interviews, il y avait suffisamment de connaissances décrites dans l'article - habr.com/ru/post/486820



All Articles