PHP 4 では、変数は通常 var を使用して宣言されますが、PHP 5 では、オブジェクト指向プログラミング (OOP) の機能を使用してデータの可視性をカスタマイズできます。つまり、ここでの可視性は変数のスコープと非常に似ています。 、より優れた制御メカニズムを提供しますが、可視性修飾子には 3 つのタイプがあります:
パブリック (デフォルト) -- 変数はグローバル スコープでアクセスまたは変更できます。
保護 -- 変数は、クラス自体および (extends ステートメントを使用して) 直接派生したクラス内でのみアクセスまたは変更できます。
プライベート -- 変数はクラス内でのみアクセスまたは変更できます。
インターフェイスの実装と同様に、プログラム内でこれらのルールに違反すると重大なエラーが発生します。また、インターフェイスと同様に、インターフェイスも純粋にプログラマの便宜のために存在します。ただし、これは、特定のクラス メンバー変数の可視性を指定すると、オブジェクト内のデータを外部の影響から保護できるという意味ではありません。
MySqlDB クラスがあり、その中で $link 変数がプライベートとして宣言されているとします。これは、この変数には $this 変数を使用してオブジェクト内からのみアクセスできることを意味します。これにより、クラス外の他のオブジェクトや関数による誤った上書きが防止されます。では、visibility 属性を使用してクエリ オブジェクトを作成します。
クエリは、実行して結果を返すことができる別個のエンティティと考えることができます。一部のデータベース システムにはストアド プロシージャもあります。ストアド プロシージャは、クエリ ステートメントを保存し、呼び出されたときに対応するパラメータを受け取ります。ただし、MySQL はバージョン 5.1 より前には同様の機能を提供していませんでした。
この記事では、上記の 2 つの機能を例のクエリ オブジェクトに結合し、基本的なストアド プロシージャをシミュレートし、結果ポインタを内部に保存します。現時点では、オブジェクトからクエリを実行することに重点が置かれており、MySqlDB オブジェクトの query() 関数を呼び出すことができます。
次のパブリック関数をクエリ オブジェクトで定義できます。
__construct() -- コンストラクターは、DB インターフェイスを実装するオブジェクトへのインスタンス参照を含むパラメーターを受け取ります。
prepare() -- 関数 prepare() はクエリのストアド プロシージャを初期化します。これには、execute() 関数にパラメータとして渡される 1 つ以上の限定されたプレースホルダーが含まれる場合があります。プレースホルダーは、パラメーターの数に関連するコロン、その後にパラメーターのタイプに関連する整数と文字が続くものとして定義されます。
プレースホルダーを含む単純なクエリは次のようになります。
SELECTcol1,col2 FROM table_name WHEREcol1=:1Iexecute
() -- 関数execute()がクエリを実行します。 prepare() 関数によってストアド プロシージャとして途中で初期化された場合、渡されたパラメータはストアド プロシージャの実行パラメータとして使用されます。それ以外の場合、最初のパラメータはクエリ テキストとしてのみ使用されます。関数execute()は、クエリの実行後に結果を返します。
コンパイル() - 関数compile()は関数execute()に似ています。実際、クエリは実行されませんが、クエリ文字列内のすべてのプレースホルダを置き換え、ストアド プロシージャのパラメータを受け取り、コンパイルされたバージョンを返します。クエリの。
保護されたメンバー
前述したように、可視性の概念を使用してオブジェクトの内部動作を非表示にし、内部動作に必要なデータの整合性を保護できます。前に説明したように、クエリによって返された結果ポインターは、保護された属性として保存されます。これは、クエリ オブジェクトから派生した特定のデータベース クエリ オブジェクトが一部のコア関数をオーバーロードする可能性があるためです。
コード理論について
詳しく説明するのは
これくらいにして、コードの作成を始めましょう。まず、例 1 に示すようにテンプレートを作成します。例 1: データベース クエリ クラスのテンプレート
クラス DBQuery。
{
/**
*DB インターフェースを実装するオブジェクトへの参照を保存します。
*/
保護された $db;
/**
※ストアドプロシージャの場合はtrueに設定してください。
*/
protected $stored_procedure = false
;
※すべての文字列を削除してクエリを保存します。
*/
プライベート $クエリ
/**
* は SQL で引用符を照合するために使用されます。
*/
プライベート静的 $QUOTE_MATCH = "/(".*(?db = $db;
関数
prepare($query)
{
$this->stored_procedure = true;
関数
compile($args)
{}
パブリック関数の実行($query)
{}
prepare 関数は
例 1 のテンプレートです。
最初に行う必要があるのは、prepare() 関数を構築することです。引用符で囲まれていない文字が誤ってプレースホルダーとして解析されることを防ぐために、この関数はクエリ文字列内のすべての文字を削除する必要があります。一時的に配列に保存します。文字列自体もプレースホルダによって置き換えられます。プレースホルダは通常、SQL ステートメントに出現すべきではない文字列シーケンスとして認識されます。クエリのコンパイル中に、最初にプロシージャ プレースホルダが置換され、次に文字列がクエリに戻されます。これは、preg_replace() 関数と、preg_replace() 関数として使用される別のヘルパー コールバック関数によって行われます。
例 2: prepare() 関数
/**
* クエリをストアド プロシージャとして準備します。
* @param string $query 準備されたクエリ テキスト
* @return void
*/
パブリック関数の準備($query)
{
$this->stored_procedure = true;
$this->quote_store = array(); //引用符をクリア $this->query = preg_replace(self::$QUOTE_MATCH, '$this->sql_quote_replace("1"?"1":'2')', $クエリ);
プライベート
関数 sql_quote_replace($match)
{
$number = count($this->query_strings);
$this->query_strings[] = $match;
"$||$$番号" を返します。
、
静的な QUOTE_MATCH 属性 private と、quote_store 属性および sql_quote_replace() 関数が使用されていることに注意してください。 protected と比較して、ここでプライベートとして定義すると、クエリ クラスの prepare() メソッドをオーバーライドするサブクラスが独自のメカニズムを使用して引用符を削除することが保証されます。
関数のコンパイル
次のステップは、compile() 関数とexecute() 関数を構築することです。
例 3 に示すように、関数compile() には次の関数があります。
· 受け入れられるパラメータの数は変数 (つまり、変数パラメータ) であり、クエリ内のプレースホルダと一致します。
· プレースホルダーのデータ型が正しいことを確認し、パラメーターの値に置き換えます。
·クエリを文字列として返しますが、実行はしません。
·prepare()関数を使用してクエリオブジェクトがストアドプロシージャとして初期化されていない場合、例外がスローされます。
例 3: コンパイル() 関数
/**
* コンパイルされたクエリを返しますが、実行はしません。
* @param 混合 $args,... クエリ パラメータ
* @return string コンパイルされたクエリ
*/
パブリック関数コンパイル($params)
{
if (! $this->stored_procedure) {
throw new Exception("ストアド プロシージャが初期化されていません!");
}
/* 置換パラメータ*/
$params = func_get_args(); // 関数パラメータを取得 $query = preg_replace("/(?query);
return $this->add_strings($query); // 文字列をクエリに戻します
}
/**
* prepare() 関数によって削除された文字列を再挿入します。
*/
プライベート関数 add_strings($string)
{
$numbers = array_keys($this->query_strings);
$count = count($numbers);
$searches = 配列();
for($x = 0; $x < $count; $x++) {
$searches[$x] = "$||${$numbers[$x]}";
return str_replace($searches, $this->query_strings, $string)
;
}
/**
※実行するたびにストアドプロシージャ内のプレースホルダーが置き換えられます。
*/
保護された関数compile_callback($params, $index, $type)
{
--$index;
/* 例外をスローします */
if (! isset($params[$index])) {
throw new Exception("ストアド プロシージャは必要な数のパラメータを受け取りませんでした!");
}
/* 日付や時刻など、他のタイプをここに追加できます。 */
スイッチ ($type) {
ケース「S」:
return '"' . $this->db->escape_string($params[$index]) . '"';
壊す;
ケース「私」:
return (int) $params[$index];
壊す;
ケース「N」:
return (float) $params[$index];
デフォルト:
throw new Exception("ストアド プロシージャで指定されたデータ型 '$type' は認識されません。");
}
、
compile_callback() 関数は preg_replace() 関数呼び出しのコールバック関数として使用され、クエリ内でプレースホルダーが見つかるたびに、 に渡された値に置き換えられます。関数の値をコンパイルすると、その関数が実行されます。
関数execute
最後に、関数execute()を構築する必要があります。関数execute()はクエリをコンパイルし、DBオブジェクトを使用して実行します。これは、ここでDBQueryオブジェクトを初期化するために使用されます。例 4 では、コンパイルされたクエリを取得するために関数 call_user_func_array() がどのように使用されているかに注意してください。その理由は、関数execute() が実行時まで渡される引数の数を決定できないためです。
例 4:execute() 関数
/**
*
* 現在のクエリを実行し、プレースホルダーを指定されたパラメーターに置き換えます。
*
* @param 混合 $queryParams,... クエリパラメータ
* @return resource 実行されたクエリを表すリソースへの参照。
*/
パブリック関数実行($queryParams = '')
{
//例: SELECT * FROM table WHERE name=:1S AND type=:2I AND level=:3N
$args = func_get_args();
if ($this->stored_procedure) {
/* 関数compileを呼び出してクエリを取得します */
$query = call_user_func_array(array($this, 'compile'), $args);
} それ以外 {
/* ストアド プロシージャが初期化されていない場合は、標準クエリとして実行します。 */
$query = $queryParams;
$
this->result = $this->db->query($query);
を返します。
オブジェクト
の使用方法を示すために、DBQuery オブジェクトをストアド プロシージャとして使用し、正しいユーザー名とパスワードが入力されているかどうかを確認する小さな例を以下に示し
ます。「例 5:例」
を参照してください。
5:
「mysql_db.php5」が必要です。
require_once 'query2.php5';
$db = 新しい MySqlDb;
$db->connect('ホスト', 'ユーザー名', 'パス');
$db->query('use content_management_system');
$query = new DBQuery($db);
$query->prepare('SELECT fname,sname FROM users WHERE username=:1S AND pword=:2S AND expire_time<:3I ');
if ($result = $query->execute("visualad", "apron", time())) {
if ($db->num_rows($result) == 1) {
echo('資格情報は正しいです。');
} それ以外 {
echo('認証情報が正しくないため、セッションの有効期限が切れています。');
}
} それ以外 {
echo('クエリの実行中にエラーが発生しました:' . $db->error());
この記事では、クラス変数を宣言するときにアクセス修飾子 private、protected、public を使用してデータを保護し、データ オブジェクトの可視性を制限する方法を説明しました。同時に、これらの概念は PHP 5 でも使用できます
。
重要な内部データを保護するための他のデータ クラス。