PHP-Entwickler Interview im Jahr 2020

Es ist einfach so passiert, dass ich dieses Jahr eine Reihe von Interviews für die Position des PHP-Entwicklers durchlaufen habe, die ich seit mehreren Jahren nicht mehr gemacht habe. Als fauler Praktiker habe ich vor dem Interview versucht, eine Sammlung von Fragen und Antworten zu finden, aber alles, was ich fand, war ziemlich alt, und so beschloss ich, eine Liste von Fragen zu erstellen, die ich selbst traf.



Normalerweise geben Artikel dieser Art vollständige Antworten auf Fragen, aber wenn Sie für eine ziemlich ernsthafte Position interviewen, reicht eine kurze Zusammenfassung offensichtlich nicht aus und Sie müssen die Frage selbst ziemlich gründlich verstehen, daher habe ich hauptsächlich Links zu Dokumentationen oder Artikeln zu den beschriebenen Themen eingefügt.



PHP



  1. Was ist neu in PHP 7. *
  2. Datentypen
  3. Geben Sie Hinweis + Strict-Modus ein
  4. Starker versus loser Vergleich
  5. Arbeiten mit Links
  6. Copy-on-Write
  7. Laufzeitfehlerbehandlung
  8. Verschlüsse
  9. Array-Funktionen
  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, ich erinnere mich an die Zeiten, als ich Ihnen sagte, was der Unterschied zwischen Version 4 und 5 ist, ohne die 4. in meinen Augen zu sehen, alte Traditionen müssen beachtet werden, die Frage taucht in fast allen Interviews auf, und obwohl niemand erwartet, dass Sie sich buchstäblich daran erinnern, welche Version welche Änderungen sind im Allgemeinen aufgetreten. Diese Informationen sind wissenswert:





Datentypen



Obwohl PHP eine dynamische Sprache ist, sind alle darin enthaltenen Daten von unterschiedlichen Typen:

Skalartypen:



  • Bool
  • int
  • float (manchmal wird der Name double verwendet, was für PHP keinen Unterschied macht)
  • Zeichenfolge


Gemischte Typen:

  • Array
  • Objekt
  • abrufbar
  • wiederholbar


Spezielle Typen:



  • Ressource
  • Null


Weitere Informationen zu Typen und Pseudotypen finden Sie in der Dokumentation .



Geben Sie Hinweis + Strict-Modus ein



Als logische Fortsetzung des mit PHP 7 * gelieferten Themas Typen und starkes Tippen müssen Sie den Unterschied zwischen starkem und losem Tippen kennen. Weitere Informationen finden Sie in der Dokumentation .



Starker versus loser Vergleich



Sie müssen den Unterschied zwischen losem Vergleich (Vergleich von Werten ohne Berücksichtigung des Datentyps) und striktem Vergleich (unter Berücksichtigung des Datentyps) verstehen, den diese Tabelle recht gut widerspiegelt . Wir sollten auch den strengen und losen Vergleich von Objekten hervorheben .



Arbeiten mit Links



Referenzen in PHP sind ungefähr eine Möglichkeit, auf dieselbe Variable (Speicherbereich) unter verschiedenen Namen zuzugreifen.



Die wichtigsten Operationen, die mit Links ausgeführt werden können:





Es ist wichtig, die Besonderheiten vorbeigehender Objekte zu verstehen. Sie konnten lesen, dass in PHP alle Objekte als Referenz übergeben werden.

na ja, aber eigentlich nein



Dies war vor PHP5 der Fall, aber jetzt wird nur die Objektkennung übergeben ( Dokumentation ).

Kurz gesagt, wenn Sie ein Objekt erstellt und an eine Funktion übergeben haben, in der Sie es getan haben

$object = null;
Dies bedeutet nicht, dass das ursprüngliche Objekt ebenfalls auf Null gesetzt wird. Sie können trotzdem damit arbeiten. Wenn Sie jedoch ein Objekt explizit als Referenz übergeben haben, wird durch diese Aktion auch das ursprüngliche Objekt auf Null gesetzt.



Copy-on-Write



Jedes Mal, wenn eine Variable an eine Funktion übergeben wird, sollte ihr Wert (theoretisch) kopiert werden. Dies ist möglicherweise kein Problem für Integer- oder Float-Daten. Stellen Sie sich jedoch vor, Sie übergeben ein Array mit zehn Millionen Werten an eine Funktion. Um dies zu vermeiden, verwendet PHP das Copy-on-Write-Paradigma. Wenn Sie also ein Array übergeben, wird es erst kopiert, wenn Sie etwas in diesem Array ändern möchten. Ein Artikel mit einer detaillierteren Erklärung.



Laufzeitfehlerbehandlung



In der 7. Version von PHP gab es eine Reihe von Änderungen, die sich auf die Fehlerhierarchie beziehen (weitere Informationen zur Hierarchie ), andernfalls wird vom Antragsteller erwartet, dass er weiß, wie er Ausnahmen abfängt , oder sogar in der Lage ist, seinen eigenen error_handler zu schreiben .



Verschlüsse



Sie sind auch anonyme Funktionen, die am nützlichsten als Werte für Rückrufparameter und Dokumentation sind . Es gibt einen guten, wenn auch etwas alten Artikel über die Arbeit mit Verschlüssen in Habré .



Array-Funktionen



Wird oft gebeten, alle Funktionen für die Arbeit mit Arrays zu benennen, an die Sie sich aus dem Speicher erinnern. Und obwohl diese Frage meiner Meinung nach etwas mehr als bedeutungslos ist, kann die Liste der Funktionen in der Dokumentation wiederholt werden .



List () Funktion



Dank der Änderungen in PHP 7.1 ist die Verwendung der Funktion komfortabler geworden. Daher wird sie häufiger verwendet. Alle Informationen finden Sie in der Dokumentation .



Variabler Umfang



In den meisten Fällen haben alle Variablen nur einen Bereich , mit Ausnahme von global / superglobals, die, wie der Name schon sagt, überall verfügbar sind, sowie static / constants.



Klasseneigenschaft / Methode / konstanter Bereich



Es wird mit den Schlüsselwörtern public (für alle sichtbar), protected (nur für die aktuelle Klasse oder deren Nachkommen verfügbar) oder private (nur für die aktuelle Klasse verfügbar) definiert und kann sowohl für Eigenschaften / Methoden als auch seit PHP 7.1 für Klassenkonstanten verwendet werden. Lesen Sie mehr in der Dokumentation .



Abschlussklassen und Methoden



Indem Sie das Schlüsselwort final vor Klassenmethodendeklarationen platzieren, können Sie verhindern, dass diese in untergeordneten Klassen überschrieben werden. Wenn die Klasse selbst als final deklariert wird, kann sie nicht vererbt werden. Solche Klassen und Methoden sollen vertraulichen Code vor Änderungen schützen, und der Code selbst wird einfacher zu warten.

Lesen Sie mehr in der Dokumentation .



Späte statische Verknüpfung



Ausgedrückt als Unterschied zwischen dem Aufruf von self :: und static ::. "Späte Bindung" bedeutet, dass static :: zur Laufzeit ausgewertet und in abgeleiteten Klassen neu definiert werden kann. Lesen Sie mehr in der Dokumentation .



Magische Methoden



In PHP gibt es absolut keinen Ort ohne Magie. Daher verfügen wir über Methoden, mit denen wir zusätzliche Funktionen für ein Objekt implementieren, das Standardverhalten eines Objekts (z. B. __serialize () / __ unserialize ()) oder das Verhalten eines Objekts in atypischen Situationen (__toString ()) und überschreiben können Andere.

Dokumentation und ein guter, wenn auch etwas veralteter Artikel über habr .



Dynamische Variablen



Sie können den Namen einer Variablen an eine andere übergeben und diese Variable dann „dynamisch“ verwenden.



Sie sollten mit großer Sorgfalt verwendet werden, da sie das Lesen und Verwalten des Codes erheblich erschweren können (es ist oft unmöglich zu verstehen, was sich in einer Variablen befindet, ohne den Code auszuführen), aber sie können in Abstraktionen sehr nützlich sein. Lesen Sie mehr in der Dokumentation .



Generatoren



Generatoren (Schlüsselwort yield) erstellen einfache Iteratoren, um Speicherplatz in Situationen zu sparen, in denen Sie über eine große Datenmenge iterieren müssen. Es kann etwas schwierig sein, sie zu verstehen, bevor Sie Ihren Generator schreiben.



Die Beschreibung befindet sich in der Dokumentation , und es gibt eine ziemlich alte (die Syntax der Generatoren hat sich seitdem nicht geändert) und einen guten Artikel über Habré .



Reflexions-API



Kurz gesagt, es ist die Möglichkeit, in den eigenen Code (oder in den Code eines anderen) zu schauen, herauszufinden, welche Variablen, Methoden und Konstanten eine Klasse hat, und sie auf Wunsch öffentlich zu machen. Diese Fähigkeit wird von Frameworks (z. B. in einer Symphonie zur automatischen Generierung der Abhängigkeitsinjektion) und Bibliotheken aktiv genutzt. Beschreibung in der Dokumentation und natürlich ein Artikel über Habré .



Autoloader



Normalerweise ist es bei Projekten sehr selten erforderlich, das automatische Laden von Klassen selbst zu implementieren. Für Unternehmen, die alle Lösungen selbst schreiben (z. B. große Unternehmen, die nicht mit Open Source arbeiten möchten) oder einige spezielle Projekte, ist dies jedoch relevant. Es kann auch hilfreich sein zu verstehen, wie es funktioniert.





SPL



Oder Standart PHP Library - eine Reihe von Klassen (Datenstrukturen, Iteratoren, Ausnahmen, Klassen zum Verarbeiten von Dateien), Schnittstellen und Funktionen zum Lösen von Standardproblemen. In der Regel ist es nicht erforderlich, die Bibliothek auswendig zu kennen, aber es lohnt sich zumindest für die persönliche Entwicklung, zu verstehen, woraus sie besteht. Weitere Details in der Dokumentation - www.php.net/manual/ru/book.spl.php



APC / APCu



Alternativer PHP-Cache (APC) oder alternativer Cache ohne Opcode (APCu) ist ein kostenloser Open-Source-Cache zum Zwischenspeichern und Optimieren von PHP-Zwischencode. Es wird hauptsächlich zum Speichern von Berechnungen zwischen Anforderungen verwendet. Dokumentation:







OPcache



Verbessert die PHP-Leistung durch Speichern des kompilierten Skriptbytecodes im gemeinsam genutzten Speicher, sodass PHP bei jeder Anforderung keine Skripts laden und analysieren muss. Offizielle Dokumentation sowie ein sehr guter Artikel darüber, wie alles auf Habré funktioniert .



PSR-Standards



Empfehlungen zu PHP-Standards - Standards für die Codierung sowie Schnittstellen für allgemeine Aufgaben. Diese Standards werden in allen (mir bekannten) Frameworks verwendet und erleichtern die Interaktion zwischen verschiedenen Bibliotheken. Offizielle Dokumentation sowie ein guter Artikel über Habré .



Komponist



Abhängigkeitsmanager sowie ein Tool, das das automatische Laden des Bibliothekscodes und der Anwendung selbst implementiert . Kann helfen , Ihre Produktions- App zu optimieren und zu beschleunigen .



XDebug



Die meisten Entwickler verwenden diese Erweiterung, um die Arbeit mit dem Code zu vereinfachen oder ihn zu optimieren. Grundlegende Kenntnisse hier sind das Einrichten und Ausführen des Codes. Der folgende Artikel blog.denisbondar.com/post/phpstorm_docker_xdebug hilft dabei .



Rest API



REpresentational State Transfer ist ein Architekturansatz, mit dem Sie die Interaktion zwischen Anwendungen unter Verwendung aller Funktionen von HTTP organisieren können. Guter Artikel zu diesem Thema und auch die Unterschiede zwischen REST und SOAP .

Im Kontext einer API müssen Sie die grundlegenden Datenaustauschformate verstehen, meistens XML und JSON .



Tests



Alle Unit-Tests basieren auf PHPUnit (soweit ich weiß), und heutzutage ist es ein obligatorischer Bestandteil der Entwicklung, in der Lage zu sein und zu wissen, wie man Tests schreibt. Viele Frameworks (wie Symfony) bieten ihre eigenen Wrapper und Testlösungen an. Hier ist ein guter Artikel über die besten Testwerkzeuge .



OOP



Verkapselung / Vererbung / Polymorphismus



  • . , , , . , . .. . ( ) . , , .
  • . , , , .
  • Polymorphismus . Dies ist eine Eigenschaft, mit der derselbe Name verwendet werden kann, um mehrere technisch unterschiedliche Probleme zu lösen. In einfachen Worten ist das Konzept des Polymorphismus die Idee von „einer Schnittstelle, vielen Implementierungen“. Dies bedeutet, dass Sie eine gemeinsame Schnittstelle für eine Gruppe verwandter Aktionen erstellen können.


Abstrakte Klassen / Methoden



  • Beinhaltet keine Instanziierung.
  • Sie implementieren in der Praxis eines der Prinzipien des OOP - Polymorphismus.
  • Kann abstrakte Methoden und Eigenschaften enthalten. Eine abstrakte Methode ist nicht für die Klasse implementiert, in der sie beschrieben wird, sondern muss für ihre nicht abstrakten Nachkommen implementiert werden.
  • Sie stellen die allgemeinsten Abstraktionen dar, dh sie haben das größte Volumen und den geringsten Inhalt.


Implementierungsnuancen in der Dokumentation .



Schnittstellen



Eine Schnittstelle kann im Gegensatz zu einer abstrakten Klasse keine Felder und Methoden enthalten, für die eine Implementierung erforderlich ist. Sie beschreibt nur die Methodensignaturen, die ihre Erben implementieren müssen. Im Gegensatz zur gleichen abstrakten Klasse kann eine Klasse viele Schnittstellen gleichzeitig implementieren.



Offizielle Dokumentation und ein guter Artikel über Habré .



Züge



Das Merkmal ist einer Klasse sehr ähnlich, dient jedoch zur Gruppierung von Funktionen und ihrer weiteren Wiederverwendung in einer Reihe von Klassen, die nicht durch eine abstrakte Klasse verknüpft werden können. Es wird auch manchmal gesagt, dass ein Merkmal eine Möglichkeit ist, Mehrfachvererbung in PHP zu implementieren.



Da jede Klasse viele Merkmale implementieren kann, können Konflikte auftreten, wenn dieselbe Methode in verschiedenen Merkmalen und / oder in der Klasse selbst implementiert wird. Weitere Informationen zu Merkmalen finden Sie in der Dokumentation .



GRASP-Vorlagen



Allgemeine Software-Muster für die Zuweisung von Verantwortlichkeiten - Entwurfsmuster zur Lösung häufiger Probleme. Im Gegensatz zu Mustern aus der Viererbande haben GRAPS-Muster keine ausgeprägte Struktur, einen klaren Umfang und ein spezifisches zu lösendes Problem, sondern stellen nur verallgemeinerte Ansätze / Empfehlungen / Prinzipien dar, die beim Entwurf des Systemdesigns verwendet werden.



Ein guter Artikel zum Thema - habr.com/ru/post/92570



Gruppe von vier Mustern



Das Thema Muster ist groß, es wurden bereits viele Artikel darüber geschrieben, und es ist einfach unmöglich, es in wenigen Sätzen zu beschreiben. Ich mag diese Ressource - refactoring.guru/ru/design-patterns/catalog , aber Sie können diesen Link bei Bedarf verwenden .



SOLIDE



Jeder fragt ihn, aber sie fragen ihn anders.



Schlechte Option - Sie werden aufgefordert, die Prinzipien und ihre Definitionen aus dem Speicher zu lesen.

Gut - sie erzählen Ihnen ein Prinzip und bitten Sie, es zu erklären, Anwendungsbeispiele zu beschreiben und eine reale Situation zu finden, in der dieses oder jenes Prinzip irgendwie helfen wird. Diese Option macht es meiner Meinung nach viel besser, das Niveau des Kandidaten und sein wirkliches Verständnis der Prinzipien zu verstehen.



Auf Habré finden Sie Dutzende wirklich guter Artikel zu diesen Prinzipien, daher verlinke ich auf Medium .



Kuss



Halten Sie es einfach, dumm ist ein gutes Prinzip, dessen Sinn bereits im Titel enthalten ist. Mehr erfahren Sie hier .



Trocken



Wiederholen Sie sich nicht - das Prinzip, dass Sie Ihren Code nach Möglichkeit wiederverwenden sollten. Weitere Details hier .



Datenbanken



Einen guten Artikel zu SQL-Datenbanken finden Sie hier . Fragen zu NoSql-Datenbanken in meinem Fall finden Sie normalerweise am Beispiel von MongoDB . Bei ElasticSearch werden normalerweise Wrapper-Bibliotheken verwendet. Allgemeine Informationen finden Sie im Artikel über Habré .



In Speicherspeicher (diejenigen , die Speicherung von Werten in RAM) sind Memcached und / oder redis (meistens), in der Regel die Arbeit mit ihnen durch Wrapperbibliotheken durchgeführt, wenn Sie das Problem im Detail verstehen wollen, natürlich gibt es einen Artikel über Habré .



Docker



Ein sehr wichtiges Werkzeug, das (in meinem Fall) bei fast allen Projekten verwendet wurde. Und obwohl es oft einmal pro Projekt konfiguriert wird, müssen Sie die grundlegenden Konzepte und das Prinzip der Arbeit damit kennen. Ich persönlich liebe diesen Artikel für ein Vorstellungsgespräch .



HTTP und andere Protokolle



Natürlich sollte jeder Webentwickler wissen und verstehen, wie Datenübertragungsprotokolle funktionieren (zumindest Protokolle der obersten Ebene). Das Thema ist groß und es ist schwierig, es in mehrere Sätze zu fassen . Es gibt einen ausführlichen Artikel zu diesem Thema über Habré .



Autorisierung und Authentifizierung



Die Autorisierung ist die Gewährung von Rechten zur Ausführung bestimmter Aktionen sowie die Überprüfung der Rechte bei dem Versuch, diese Aktionen auszuführen.



Die Authentifizierung ist ein Authentifizierungsverfahren, bei dem beispielsweise die Identität eines Benutzers durch Vergleichen des von ihm eingegebenen Kennworts überprüft wird.



Es ist wichtig, den Unterschied zwischen Autorisierung und Authentifizierung zu verstehen , wie sie mithilfe von Sitzungen und Cookies , JSON-Web-Tokens ( JWT ) usw. implementiert werden .



Js



Ich kenne diese Sprache nicht wirklich, daher gebe ich nie vor, Positionen zu sein, in denen man js Frameworks kennen und Full-Stack sein muss. Vielleicht wurde deshalb für alle Interviews genug Wissen im Artikel beschrieben - habr.com/ru/post/486820



All Articles