1. ホーム
  2. php

優秀なPHP開発者が答えるべき質問 [終了しました]

2023-11-02 14:08:12

質問

私は 優秀な .Net 開発者なら誰でも答えられるはずの質問 を読んでいて、この質問の内容とアプローチに非常に感銘を受けたので、同じ精神で、私はPHP開発者のためにこの質問をしています。

どのような質問 はどうあるべきだと思いますか? PHPプログラマは答えることができるでしょうか?

EDIT : この質問はユーザー固有ではなく、プログラミングコミュニティ全体に役立つことを目的としているため、私はこの質問をコミュニティWikiとしてマークしています。

いくつかの素晴らしい回答を期待しています。

注意 : 人々が言語に関しても何か新しいことを学ぶことができるように、コメントで提案された質問にも答えてください。

どのように解決するのですか?

確かに、私はこの質問をどこかから盗んできたのですが(もうどこで読んだか覚えていません)、面白いと思ったのです。

Q: とは何ですか? T_PAAMAYIM_NEKUDOTAYIM ?

A: スコープ解決演算子(ダブルコロン)です。

経験豊富なPHP開発者は、この演算子が何を意味するのかすぐにわかるでしょう。 経験の浅い (そしてヘブライ語ではない) 開発者は この .

しかし、今はもっと深刻な問題があります。


Q: この警告: 'Warning: Cannot modify header information - headers already sent', and what is a good practice to prevent it?

A: 原因 ボディデータが送信されたため、ヘッダも送信されてしまいました。

防止策です。 ボディデータを出力する前に、必ずヘッダー固有のコードを先に実行してください。誤って空白や他の文字を送信していないことを確認してください。


Q: このクエリのどこが問題なのでしょうか。 "SELECT * FROM table WHERE id = $_POST[ 'id' ]" ?

A: 1. SQLインジェクションの危険性があります。ユーザー入力を直接クエリで使用しないでください。最初にサニタイズしてください。プリペアドステートメント ( PDO ) 2. すべてのカラムを選択するのではなく(*)、1つ1つのカラムを指定します。これは、たとえば、将来のある時点で BLOB カラムが追加されたときに、クエリがメモリを占有するのを防ぐための主な理由です。


Q: このif文のどこが問題なのでしょうか。 if( !strpos( $haystack, $needle ) ... ?

A: strpos は、最初に$needleを見つけた場所のインデックス位置を返します。 0 . ということは 0 にも解決されます。 false を解決するには、厳密な比較を使用することです。 if( false !== strpos( $haystack, $needle )...


Q: このif文はどのように書くのが好ましいですか?

if( 5 == $someVar ) または if( $someVar == 5 )

A: 前者は、2つの等号を使い忘れたときに、誤って$someVarに5を代入することを防ぐためです( $someVar = 5 ) を忘れてもエラーになりますが、後者はそうなりません。


Q: このコードから

function doSomething( &$arg )
{
    $return = $arg;
    $arg += 1;
    return $return;
}

$a = 3;
$b = doSomething( $a );

...の値は何ですか? $a$b という関数呼び出しの後、なぜ?

A: $a4 であり $b3 . 前者は$argが参照渡しであるため、後者は関数の戻り値が引数の初期値のコピー(参照ではない)であるためです。


OOP特有の

Q: とはどのような違いがあるのでしょうか? public , protectedprivate をクラス定義に含めることはできますか?

A: public は、クラスのメンバーを "誰でも" 利用できるようにします。 protected は自分自身と派生クラスのみがクラスメンバを利用できるようにします。 private はそのクラス自身だけがそのクラスのメンバを利用できるようにします。


Q: このコードのどこが問題なのでしょうか。

class SomeClass
{
    protected $_someMember;

    public function __construct()
    {
        $this->_someMember = 1;
    }

    public static function getSomethingStatic()
    {
        return $this->_someMember * 5; // here's the catch
    }
}

A: 静的メソッドはクラスをインスタンス化せずに実行できるため、$thisにアクセスすることはできません。


Q: インターフェースと抽象クラスの違いは何ですか?

A: インターフェースは、実装クラスとそのインターフェースを呼び出すオブジェクトとの間の契約を定義します。抽象クラスは、それを継承するクラスに対して、ある種の振る舞いをあらかじめ定義しています。これは、あるメソッドが存在することを保証しているため、ある程度は契約とみなすことができます。


Q: 実際に動作を実行するメソッドを持たず、内部メンバーに直接マッピングするゲッターとセッターを主に定義するクラスの何が問題なのでしょうか?

A: オブジェクトは他の用途はあまりなく、組み込まれた配列として機能するので、これはコード臭かもしれません。


Q: なぜPHPはインターフェースの使用に関する実装が最適ではないのでしょうか?

A: PHPはメソッドの戻り値の型を定義することができないので、基本的にインターフェースはかなり役に立ちません。