「PHP & MySQL Examples - Create, Modify and Reuse」という本を借りました。 2008年に出版された古い本ですが、私のような初心者にとっても、これらの基本的な設計思想は決して古くならないのです。
この本には、開発プロセスの最初のステップはプログラムのディレクトリ構造を設計することであると書かれています。それぞれ 3 つのメイン フォルダーを作成することをお勧めします:
Web サーバーは、public_files の下にあるファイルへのアクセスのみを許可します。これにより、システムのセキュリティが強化されます。
めったに使用されないデータ、または一度しか使用されないデータを別のテーブルに保存し、データの冗長性を避けるために適時に削除します。たとえば、この本では、ユーザーのアクティベーション関連の情報を別の表にまとめています。この情報はアクティベーション中に一度だけ使用され、使用後は削除されるためです。
共有コードとデータベースにリンクするコードをそれぞれ1つのファイルに存在させることで、コードの再利用性が高まり、他のファイルを呼びやすくなります。
MVCの考え方では、この部分はモデルの設計に属します。クラスを設計するときは、オブジェクト指向プログラミングでは、オブジェクトが実体に相当することに留意する必要があります。クラスの属性はオブジェクトを記述するために使用され、クラスのメソッドはオブジェクトを直接操作したり、オブジェクトに関連する操作を実行したりするために使用されます。ユーザー クラスの場合、まず、このクラスの属性であるユーザー ID、ユーザー名、パスワードなどのユーザー情報が必要です。さらに、情報の検索、作成、更新、ユーザーのアクティブ化などの操作を実行する必要があるため、これらの操作を完了するための対応するメソッドが存在します。
属性のオーバーロードこの本では、オーバーロードの緩和を利用して属性を動的に作成します。この利点は、将来いくつかの属性を追加する場合、コードを変更する必要がほとんどなく、追加する必要がある属性を直接呼び出すだけで済むことです。オーバーロードを使用してプロパティを動的に作成することは、コードに新しいプロパティを直接追加することとは異なります。プロパティのオーバーロードでは、マジック メソッド __get() および __set() を使用します。アクセスできないプロパティ (未定義または非表示) に値を割り当てる場合は __set() が呼び出され、アクセスできないプロパティの値を読み取る場合は __get() が呼び出されます。通常、オーバーロードされた属性のデータは __set() を通じてプライベート配列フィールドに保存され、オーバーロードされた属性を読み取る必要がある場合は、__get() を通じてこのプライベート配列フィールドから読み取られます。サンプルコードは以下のとおりです:
class User{ private $uid; private $field; //initialize a User object public function __construct() { $this->uid = null; $this->field = array('username' => '', 'password' => '', 'emailAddr' => '', 'isActive' => false); } //override magic method to retrieve properties public function __get($field) { if($field == 'userId'){ return $this->uid; }else{ return $this->field[$field]; } } //override magic method to set properties public function __set($field, $value) { if(array_key_exists($field, $this->field)){ $this->field[$field] = $value; } }}
PHP でのオーバーロードは他の言語のオーバーロードとは異なることに注意してください。他の言語におけるオーバーロードとは、一般に、同じ名前で異なる数のパラメーターを持つ複数の関数を実装することを指します。 PHP のオーバーロードの詳細については、PHP マニュアルを参照してください: オーバーロード
データを処理する前にデータを検証する必要があります。データが期待どおりであることが検証されると、データが処理されます。そうしないと、予期しないエラーが発生する可能性があります。初心者はこれを見落としがちです。たとえば、PHP コードでは、ある量が空であるかどうかを検出し、空でない場合に操作が実行されることがよくあります。
検索、保存などのメソッドを実装するには、動的 SQL ステートメントを使用する必要があります。この本は sprintf() 関数を通じて実装されています。 sprintf() 関数は、C# の String.Format() に似ています。ただし、この方法は少々面倒で、現時点ではもっと良い方法があるのではないかと個人的には感じています。 sprintf() 関数を使用して動的 SQL を実装する場合、コードのセキュリティを確保するために、より複雑な文字列パラメーターを real_escape_string() 関数を使用してエスケープする必要があります。 (エンコーディングの問題は一般に SQL インジェクションに関連しているようです)。
テンプレートを使用してロジックとページデザインを分離します。この本ではここで単純なテンプレートを使用します。ページの各部分の内容を $GLOBALS 配列に保存し、テンプレート ファイルは各部分の配列の内容を直接出力します。したがって、ページを動的に表示したい場合は、$GLOBALS のコンテンツを変更してからテンプレート ファイルを表示するだけで済みます。
この記事は、主に自分の考えを整理するための簡単な勉強メモです。他の人にも役立つと良いです〜 [マークダウンで書くのは本当に楽しいです
]