PHP 4 では、通常、変数を宣言するために var が使用されますが、PHP 5 では、オブジェクト指向プログラミング (OOP) の機能を使用してデータの可視性をカスタマイズできます。つまり、ここでの可視性は変数と非常に似ています。スコープと似ていますが、より優れた制御メカニズムを提供する、次の 3 種類の可視性修飾子があります:
パブリック (デフォルト) - 変数はグローバル スコープでアクセスまたは変更できます。
保護 -- 変数は、クラス自体および直接派生した (extends ステートメントを使用した) クラス内でのみアクセスまたは変更できます。
プライベート -- 変数はクラス内でのみアクセスまたは変更できます。
インターフェースの実装と同様に、プログラム内でこれらのルールに違反すると重大なエラーが発生します。インターフェースと同様、それらは純粋にプログラマーの便宜のために存在します。ただし、これは、特定のクラス メンバー変数の可視性を指定すると、オブジェクト内のデータを外部の影響から保護できるという意味ではありません。
MySqlDB クラスがあり、その中で $link 変数がプライベートとして宣言されているとします。これは、この変数は $this 変数を使用してオブジェクトの内部からのみアクセスできることを意味し、外部の他のオブジェクトや関数による誤って上書きを防ぐことができます。ここでは、visibility 属性を使用してクエリ オブジェクトを作成します。
クエリを別個のエンティティとして扱うことができ、実行して結果を返すことができます。一部のデータベース システムにはストアド プロシージャもあります。ストアド プロシージャは、クエリ ステートメントを保存し、呼び出されたときに対応するパラメータを受け取ります。ただし、MySQL はバージョン 5.1 より前には同様の機能を提供していませんでした。
この記事では、上記の 2 つの機能をサンプルのクエリ オブジェクトに組み合わせて、基本的なストアド プロシージャをシミュレートし、結果ポインターを内部に保存します。現時点では、オブジェクトからのクエリの実行に重点が置かれており、MySqlDB オブジェクトの query() 関数を呼び出します。
次のパブリック関数をクエリ オブジェクトで定義できます:
__construct() -- コンストラクターは、DB インターフェイスを実装するオブジェクトのインスタンス参照を含むパラメーターを受け取ります。
prepare() -- 関数 prepare() はクエリのストアド プロシージャを初期化します。これには、execute() 関数にパラメータとして渡される 1 つ以上の限定されたプレースホルダーが含まれる場合があります。プレースホルダーは、パラメーターの数に関連するコロン、その後にパラメーターのタイプに関連する整数と文字が続くものとして定義されます。
プレースホルダーを含む単純なクエリは次のようになります:
SELECT col1,col2 FROM table_name WHERE col1=:1I
execute() -- 関数execute()はクエリを実行します。 prepare() 関数によってストアド プロシージャとして途中で初期化された場合、渡されたパラメータはストアド プロシージャの実行パラメータとして使用されます。それ以外の場合、最初のパラメータはクエリ テキストとしてのみ使用されます。関数execute()は、クエリの実行後に結果を返します。
compile() -- 関数compile()は関数execute()に似ていますが、実際、クエリは実行されませんが、クエリ文字列内のすべてのプレースホルダを置き換え、ストアドプロシージャのパラメータを受け取り、クエリのコンパイルされたバージョン。
保護されたメンバー
上で述べたように、可視性の概念を使用してオブジェクトの内部動作を非表示にし、内部動作に必要なデータの整合性を保護できます。前に説明したように、クエリによって返された結果ポインターは、保護された属性として保存されます。これは、クエリ オブジェクトから派生した特定のデータベース クエリ オブジェクトが一部のコア関数をオーバーロードする可能性があるためです。
コードの詳細
理論はこれくらいにして、コードを書き始めましょう。まず、例 1 に示すようにテンプレートを作成します。
例 1: データベース クエリ クラスのテンプレート
class DBQuery { /** *保存一个实现了DB接口对象的引用。 */ protected $db; /** *如果是一个存储过程,设为true。 */ protected $stored_procedure = false; /** *保存一个删除了所有字符串的query。 */ private $query; /** *用于在SQL中匹配引号。 */ private static $QUOTE_MATCH = "/(".*(?db = $db; } public function prepare($query) { $this->stored_procedure = true; } public function compile($args) {} public function execute($query) {} }
上記は、を使用して実装されます。 PHP の OOP 機能 データ保護 (1) コンテンツ。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。