2020年のPhp-開発者インタビュー

たまたま、今年はPHP開発者の立場について一連のインタビューを行いましたが、これは数年間行っていません。怠惰な実務家なので、面接前に質疑応答のコレクションを探してみましたが、見つけたものはすべてかなり古いので、自分で出会った質問のリストを用意することにしました。



通常、この種の記事は質問に完全に答えますが、かなり深刻な立場でインタビューしている場合は、簡単な要約では明らかに不十分であり、質問自体をかなり深く理解する必要があるため、主に説明されている問題に関するドキュメントまたは記事へのリンクを挿入しました。



PHP



  1. PHP7の新機能。*
  2. データタイプ
  3. タイプヒント+厳密モード
  4. 強い比較と緩い比較
  5. リンクの操作
  6. コピーオンライト
  7. 実行時エラー処理
  8. 閉鎖
  9. 配列関数
  10. リスト()関数
  11. 可変スコープ
  12. クラスプロパティ/メソッド/定数スコープ
  13. 最終的なクラスとメソッド
  14. 後期静的リンク
  15. 魔法の方法
  16. 動的変数
  17. ジェネレーター
  18. リフレクションAPI
  19. オートローダー
  20. SPL
  21. APC / APCu
  22. OPcache
  23. PSR規格
  24. 作曲
  25. XDebug
  26. Rest API
  27. テスト


OOP



  1. カプセル化/継承/多態性
  2. 抽象クラス/メソッド
  3. インターフェース
  4. 特性
  5. GRASPテンプレート
  6. 4つのパターンのギャング
  7. 固体
  8. 接吻
  9. ドライ


データベース

DockerHTTP

およびその他のプロトコルJSの

承認と認証





PHP



PHP7の新機能。*



ええと、バージョン4と5の違いを教えてくれたときのことを覚えています。私の目には4番目を見たことがないので、古い伝統を守らなければなりません。質問はほとんどすべてのインタビューで発生します。文字通りどのバージョンを覚えているとは誰も期待していませんが、変更が発生しました。一般に、この情報は知っておく価値があります。





データタイプ



PHPは動的言語ですが、PHP内のすべてのデータは異なるタイプです。

スカラータイプ:



  • ブール
  • int
  • float(phpの場合は違いがないdoubleという名前が使用されることがあります)
  • ストリング


混合タイプ:

  • アレイ
  • オブジェクト
  • 呼び出し可能
  • 反復可能


特別なタイプ:



  • 資源
  • ヌル


型と疑似型の詳細については、ドキュメントをご覧ください



タイプヒント+厳密モード



php 7に付属のタイプとストロングタイピングのトピックの論理的な続きとして、ストロングタイピングとウィークタイピングの違いについて知る必要があります詳細については、ドキュメントを参照してください



強い比較と緩い比較



緩い比較(データタイプに関係なく値の比較)と厳密な比較(データタイプを考慮)の違いを理解する必要がありますこれはこの表によく反映されていますまた、オブジェクトの厳密な比較緩い比較を強調する必要があります



リンクの操作



PHPでの参照は、大まかに言えば、異なる名前で同じ変数(メモリ領域)にアクセスする方法です。



リンクを使用して実行できる主な操作:





渡すオブジェクトの詳細を理解することが重要です。phpでは、すべてのオブジェクトが参照によって渡されることが

はい、でも実際にはありません



わかります。これはphp5より前は当てはまりましたが、現在はオブジェクト識別子のみが渡されます(ドキュメント)。

つまり、オブジェクトを作成し、それを関数に渡した場合、その中で

$object = null;
これは、元のオブジェクトもゼロにリセットされることを意味するものではなく、引き続き使用できます。ただし、参照によってオブジェクトを明示的に渡した場合、このアクションは元のオブジェクトも「ゼロ」にします。



コピーオンライト



変数が関数に渡されるたびに、その値(理論的には)をコピーする必要があります。これは整数データや浮動小数点データでは問題にならないかもしれませんが、1,000万個の値を含む配列を関数に渡すと想像してください。これを回避するために、PHPはコピーオンライトパラダイムを使用します。したがって、実際には、配列を転送するとき、そのコピーは、この配列内の何も変更したくない瞬間まで発生しません。より詳細な説明のある記事



実行時エラー処理



phpの7番目のバージョンでは、エラー階層に関連する多くの変更がありました(階層の詳細)。そうでない場合、申請者は例外キャッチする方法を知っているか、独自のerror_handlerを作成できることが期待されます。



閉鎖



これらは匿名関数でもあり、コールバックパラメータ、ドキュメントの値として最も役立ちますHabréでのクロージャーの操作については少し古い記事ですが、良い記事があります。



配列関数



多くの場合、メモリから覚えている配列を操作するためのすべての関数に名前を付けるように求められます。そして、私の意見では、この質問は無意味ではありませんが、関数のリストはドキュメントで繰り返すことができます



リスト()関数



PHP 7.1での変更のおかげで、この関数はより使いやすくなりました。その結果、より頻繁に使用され、すべての情報はドキュメントに記載されています



可変スコープ



ほとんどの場合、すべての変数には1つのスコープしかありません。ただし、グローバル/スーパーグローバルは、名前が示すように、静的/定数だけでなく、どこでも使用できます。



クラスプロパティ/メソッド/定数スコープ



これは、キーワードpublic(すべての人に表示)、protected(現在のクラスまたはその子孫のみが使用可能)、またはprivate(現在のクラスのみが使用可能)を使用して定義され、プロパティ/メソッドとPHP7.1以降のクラス定数の両方に使用できます。詳細については、ドキュメントをご覧ください



最終的なクラスとメソッド



クラスメソッド宣言の前にfinalキーワードを配置することにより、子クラスでそれらがオーバーライドされるのを防ぐことができ、クラス自体がfinalとして宣言されている場合、継承することはできません。このようなクラスとメソッドは、機密性の高いコードを変更から保護するように設計されており、コード自体の保守が容易になります。

詳細については、ドキュメントをご覧ください



後期静的リンク



self ::とstatic ::の呼び出しの違いとして表されます。「レイトバインディング」とは、静的::が実行時に評価され、派生クラスで再定義できることを意味します。詳細については、ドキュメントをご覧ください



魔法の方法



PHPでは、魔法がなければ絶対にどこにもありません。そのため、オブジェクトの追加機能を実装したり、オブジェクトの標準的な動作をオーバーライドしたり(たとえば、__ serialize()/ __ unserialize())、または非定型の状況でのオブジェクトの動作(__toString())をオーバーライドしたりできるメソッドがあります。その他。

ドキュメント、およびHabréに関する少し時代遅れの記事ですが、良い記事です



動的変数



ある変数の名前を別の変数に渡して、その変数を「動的に」使用することができます。



これらはコードの読み取りと保守の両方を大幅に複雑にする可能性があるため(コードを実行せずに変数の内容を理解することはしばしば不可能です)、細心の注意を払って使用する必要がありますが、抽象化には非常に役立ちます。詳細については、ドキュメントをご覧ください



ジェネレーター



ジェネレーター(yieldキーワード)は、大量のデータを反復処理する必要がある状況でメモリ節約するための単純な反復子を作成します。ジェネレーターを作成する直前に理解するのは少し難しいかもしれません。



説明はドキュメントにあり、かなり古いもの(ただし、ジェネレーターの構文はその時点から変更されていません)とHabréに関する優れた記事があります。



リフレクションAPI



要するに、それはあなた自身の(または他の誰かの)コードの内部を調べ、クラスが持っている変数、メソッド、定数を見つけ、必要に応じてそれらを公開する機能です。この機能は、フレームワーク(たとえば、依存関係インジェクションの自動生成のシンフォニー)およびライブラリによって積極的に使用されます。ドキュメント内の説明、そしてもちろん、Habréに関する記事



オートローダー



通常、プロジェクトではクラスの自動読み込みを自分で実装する必要はほとんどありませんが、すべてのソリューションを独自に作成する企業(たとえば、オープンソースでの作業を望まない大企業)や一部の特別なプロジェクトでは、これが関係します。それがどのように機能するかを理解することも役立ちます。





SPL



またはStandartPHP Library-標準的な問題を解決するためのクラス(データ構造、イテレーター、例外、ファイルを処理するためのクラス)、インターフェース、および関数のセット。原則として、ライブラリを暗記する必要はありませんが、ライブラリが何で構成されているかを理解することは、少なくとも個人的な開発には価値があります。ドキュメントの詳細-www.php.net/manual/ru/book.spl.php



APC / APCu



代替PHPキャッシュ(APC)またはopcodeなしの代替キャッシュ(APCu)は、PHP中間コードをキャッシュおよび最適化するために設計された無料のオープンソースキャッシュです。これは主に、リクエスト間の計算を保存するために使用されます。ドキュメンテーション:







OPcache



コンパイルされたスクリプトバイトコードを共有メモリに保存することでPHPのパフォーマンスを向上させ、要求ごとにPHPがスクリプトをロードして解析する必要をなくします。公式ドキュメント、およびすべてがHabréでどのように機能するかについての非常に優れた記事



PSR規格



PHP標準の推奨事項-コーディングの標準、および一般的なタスクのインターフェイス。これらの標準は、すべての(私が知っている)フレームワークで使用され、異なるライブラリ間の相互作用を容易にします。公式ドキュメントHabréに関する優れた記事



作曲



依存関係マネージャーおよびライブラリコードとアプリケーション自体の自動ロードを実装するツールプロダクションアプリの最適化とスピードアップに役立ちます



XDebug



ほとんどの開発者は、この拡張機能を使用して、コードの操作や最適化を容易にします。ここでの基本的な知識は、コードの構成と実行の方法です。次の記事blog.denisbondar.com/post/phpstorm_docker_xdebugがこれに役立ちます



Rest API



REpresentational State Transferは、HTTPのすべての機能を使用してアプリケーション間の相互作用を整理できるようにするアーキテクチャアプローチです。このトピックに関する優れた記事と、RESTとSOAPの違いについても説明ます。

APIのコンテキストでは、基本的なデータ交換フォーマット、ほとんどの場合XMLJSONを理解する必要があります



テスト



すべてのユニットテストは(私が知る限り)PHPUnitに基づいており、今日、テストの記述方法を理解できることは、開発の必須部分です。多くのフレームワーク(Symfonyなど)は、独自のラッパーとテストソリューションを提供します。これが最高のテストツールに関する良い記事です。



OOP



カプセル化/継承/多態性



  • . , , , . , . .. . ( ) . , , .
  • . , , , .
  • 多形性これは、同じ名前を使用していくつかの技術的に異なる問題を解決できるようにするプロパティです。簡単に言えば、多態性の概念は「1つのインターフェース、多くの実装」の概念です。これは、関連するアクションのグループに共通のインターフェイスを作成できることを意味します。


抽象クラス/メソッド



  • インスタンス化は含まれません。
  • それらは実際にOOPの原則の1つである多形性を実装します。
  • 抽象メソッドとプロパティが含まれる場合があります。抽象メソッドは、それが記述されているクラスには実装されていませんが、非抽象子孫には実装する必要があります。
  • それらは最も一般的な抽象化を表します。つまり、最大のボリュームと最小のコンテンツを持ちます。


ドキュメント 内の実装のニュアンス



インターフェース



抽象クラスとは異なり、インターフェイスには、実装のあるフィールドとメソッドを含めることはできません。継承者が実装する必要のあるメソッド署名のみを記述します。同じ抽象クラスとは異なり、クラスは多くのインターフェイスを同時に実装できます。



公式ドキュメント、およびHabréに関する優れた記事



特性



特性はクラスに非常に似ていますが、機能をグループ化し、1つの抽象クラスでリンクできないクラスのセットでさらに再利用することを目的としています。特性は、PHPで複数の継承を実装する方法であるとも言われます。



各クラスは多くの特性を実装できるため、同じメソッドが異なる特性やクラス自体に実装されている場合、競合が発生する可能性があります。ドキュメントで特性の詳細をお読みください



GRASPテンプレート



一般的な責任割り当てソフトウェアパターン-一般的な問題を解決するための設計パターン。Gang of Fourのパターンとは異なり、GRAPSパターンには、明確な構造、明確な範囲、および解決すべき特定の問題はありませんが、システム設計の設計で使用される一般化されたアプローチ/推奨事項/原則のみを表しています。



トピックに関する良い記事-habr.com/ru/post/92570



4つのパターンのギャング



パターンのトピックは広大で、すでに多くの記事が書かれており、数文で説明することは不可能です。私はこのリソースが好きです--refactoring.guru/ru/design-patterns/catalogですが、必要に応じてこのリンクを使用できます



固体



誰もが彼に尋ねますが、彼らは彼に異なって尋ねます。



悪いオプション-メモリから原則とその定義を読むように求められます。

良い-彼らはあなたに原則を教え、それを説明し、使用例を説明し、これまたはその原則が何らかの形で役立つ実際の状況を考え出すようにあなたに求めます。私の意見では、このオプションは、候補者のレベルと彼の原則の本当の理解を理解することをはるかに良くします。



Habréでは、これらの原則に関する非常に優れた記事を何十も見つけることができるので、mediumリンクします。



接吻



シンプルに保つ、愚かなことは良い原則であり、その全体のポイントはすでにタイトルに含まれています、あなたはここでもっと学ぶことができます



ドライ



繰り返さないでください。可能な限りコードを再利用する必要があるという原則です。詳細はこちら



データベース



SQLデータベースに関する優れた記事はここにあります私の場合のNoSqlデータベースに関する質問は、通常、MongoDBの例にあります。ElasticSearchの場合、通常はラッパーライブラリが使用されます。一般的な情報は、Habréの記事から入手できます



メモリストレージ(RAMに値を格納するストレージ)はmemcachedおよび/またはredis(ほとんどの場合)であり、原則として、ラッパーライブラリを介して作業が実行されます。問題をより詳細に理解したい場合はもちろんHabréに関する記事があります。



Docker



ほとんどすべてのプロジェクト(私の場合)で使用されている非常に重要なツール。また、多くの場合、プロジェクトごとに1回構成されますが、基本的な概念と操作の原則を知っておく必要があります。個人的に、私は仕事のインタビューのためにこの記事が大好きです。



HTTPおよびその他のプロトコル



もちろん、Web開発者は、データ転送プロトコル(少なくともトップレベルのプロトコル)がどのように機能するかを知って理解する必要があります。トピックは大きく、いくつかの文に収めることは困難ですこのトピックに関する広範な記事がHabréにあります。



承認と認証



承認とは、特定のアクションを実行するための権限を付与すること、およびこれらのアクションを実行しようとするときに権限を確認するプロセスです。



認証は、ユーザーが入力したパスワードを比較してユーザーの身元を確認するなどの認証手順です。承認と認証の



違い、セッションとCookieを使用してそれらがどのように実装されるか、JSON Webトークン(JWT)などを理解することが重要です



Js



私はこの言語を本当に知らないので、jsフレームワークを知り、フルスタックである必要がある立場にいるふりをすることは決してありません。おそらくそれが、すべてのインタビューで記事に十分な知識があった理由です-habr.com/ru/post/486820



All Articles