ホームページ > バックエンド開発 > PHPチュートリアル > PHP5 OOP プログラミングでのエージェントと例外のカスタマイズ_PHP チュートリアル

PHP5 OOP プログラミングでのエージェントと例外のカスタマイズ_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:34:18
オリジナル
785 人が閲覧しました

1. DBQuery オブジェクト

DBQuery オブジェクトは単純にストアド プロシージャをエミュレートします。実行されると、保存する必要がある結果リソースが返されます。その結果セットに対して関数 (num_rows() や fetch_row() など) を使用したい場合は、次のようにする必要があります。 MySqlDB オブジェクトを渡します。では、MySqlDB オブジェクト (実行されたクエリの結果を操作するように設計されている) によって実装される関数を DBQuery オブジェクトが実装すると、どのような影響があるのでしょうか?前の例のコードを引き続き使用し、結果リソースが DBQuery オブジェクトによって管理されていると仮定します。 DBQuery クラスのソース コードをリスト 1 に示します。

リスト 1. DBQuery クラスの使用。

mysql_db.phpが必要です。 require_once クエリ
; $db = 新しい MySqlDb
; $db->connect(ホスト、ユーザー名、パス); $db->クエリ(content_management_system を使用); $query = 新しい DBQuery($db); $query->prepare(SELECT fname,sname FROM users WHERE username=:1S AND pword=:2S AND expire_time<:3i> を試してください if($query->execute("visualad", "エプロン", time()))->num_rows() == 1) {
echo(正しい資格情報)
} その他 {
echo(間違った認証情報 / セッションの期限切れ)
}
} キャッチ (QueryException $e) {
echo(クエリ実行エラー: . $e); }




上記の変更されたコードで最も注目するのは、catch ステートメントとexecute ステートメントです。

·execute ステートメントは結果リソースを返さなくなり、DBQuery オブジェクト自体を返すようになりました。

· DBQuery オブジェクトは、DB インターフェイスですでにおなじみの num_rows() 関数を実装するようになりました。

· クエリの実行が失敗した場合、QueryException タイプの例外がスローされます。文字列に変換すると、発生したエラーの詳細が返されます。

これを行うには、プロキシを使用する必要があります。実際、すでに DBQuery オブジェクトでプロキシを使用していますが、ここではそれをさらに深く使用して、MySqlDB オブジェクトに緊密に結び付けます。 DBQuery オブジェクトは、DB インターフェイスを実装するオブジェクトで初期化されており、クエリを実行する DB オブジェクトの query() メソッドを呼び出すメンバー関数executeがすでに含まれています。 DBQuery オブジェクト自体は実際にはデータベースにクエリを実行せず、このタスクを DB オブジェクトに任せます。これはプロキシであり、同じまたは類似の動作を実装する別のオブジェクトにメッセージを送信することで、オブジェクトが特定の動作を実装できるプロセスです。

これを行うには、DBQuery オブジェクトを変更して、DB オブジェクトからの結果リソースを操作するすべての関数を含める必要があります。クエリを実行するときに保存された結果を使用して、DB オブジェクトの対応する関数を呼び出し、その結果を返す必要があります。以下の機能が追加されます:

リスト 2: プロキシを使用した DBQuery クラスの拡張。

2. タイプヒント
DBQueryクラス
{
.....

パブリック関数 fetch_array()
{
if (! is_resource($this->result)) {
新しい例外をスローします(クエリは実行されません。); }

$this->db->fetch_array($this->結果)を返す
}

パブリック関数 fetch_row()
{
if (! is_resource($this->result)) {
新しい例外をスローします(クエリは実行されません。); }

$this->db->fetch_row($this->result) を返します
}

パブリック関数 fetch_assoc()
{
if (! is_resource($this->result)) {
新しい例外をスローします(クエリは実行されません。); }

$this->db->fetch_assoc($this->結果)を返します
}

パブリック関数 fetch_object()
{
if (! is_resource($this->result)) {
新しい例外をスローします(クエリは実行されません。); }

$this->db->fetch_object($this->結果)を返します
}

パブリック関数 num_rows()
{
if (! is_resource($this->result)) {
新しい例外をスローします(クエリは実行されません。); }

$this->db->num_rows($this->result) を返します
}
}




各関数の実装は非常に簡単です。まずクエリが実行されたことを確認し、次にタスクを DB オブジェクトに委任し、あたかもクエリ オブジェクトそのものであるかのように結果を返します (基本データベース関数と呼ばれます)。


プロキシが機能するためには、DBQuery オブジェクトの $db 変数が DB インターフェイスを実装するオブジェクトのインスタンスであることを確認する必要があります。型ヒントは、関数パラメータを特定の型のオブジェクトに強制的に変換できるようにする PHP 5 の新機能です。 PHP 5 より前では、関数パラメーターが特定のオブジェクト型であることを確認する唯一の方法は、PHP で提供される型チェック関数 (つまり is_a()) を使用することでした。これで、関数パラメータの前に型名を付けることで、オブジェクト型を簡単にキャストできるようになりました。 DBQuery オブジェクトからの型ヒントについてはすでに説明しました。これにより、DB インターフェイスを実装するオブジェクトがオブジェクト コンストラクターに確実に渡されます。



パブリック関数 __construct(DB $db)
{ $this->db = $db; }



型ヒントを使用する場合、オブジェクト型だけでなく、抽象クラスや抽象インターフェイスも指定できます。

3. 例外をスローする

上記のコードから、QueryException と呼ばれる例外をキャッチしていることに気づいたかもしれません (このオブジェクトは後で実装します)。例外はエラーに似ていますが、より一般的です。例外を説明する最良の方法は、emergency を使用することです。緊急事態は「致命的」ではないかもしれませんが、それでも対処する必要があります。 PHP で例外がスローされると、関数、try..catch ブロック、またはスクリプト自体のいずれであっても、現在の実行スコープはすぐに終了します。その後、例外は呼び出しスタックを横断し、各実行スコープを終了して、try..catch ブロックにキャッチされるか呼び出しスタックの先頭に到達するまで、その時点で致命的エラーが生成されます。

例外処理は、PHP 5 のもう 1 つの新機能です。OOP と組み合わせて使用​​すると、エラー処理とレポートを適切に制御できます。 try..catch ブロックは、例外を処理するための重要なメカニズムです。キャッチされると、スクリプトの実行は、例外がキャッチされて処理されたコードの次の行から続行されます。

クエリが失敗した場合は、例外をスローするように実行関数を変更する必要があります。 QueryException というカスタム例外オブジェクトをスローします。エラーの原因となった DBQuery オブジェクトがそれに渡されます。

リスト 3. 例外をスローします。

/**
*現在のクエリを実行します
*
* 現在のクエリを実行します。ドット マーカーを指定されたパラメーターに置き換えます
*
*
* @parameters: 混合 $queryParams,... クエリパラメータ
* @return: リソース A - クエリが実行されるリソースを説明する参照。
*/
パブリック関数実行($queryParams = )
{
//例: SELECT * FROM table WHERE name=:1S AND type=:2I AND level=:3N
$args = func_get_args(); if ($this->stored_procedure) {
/*コンパイル関数を呼び出してクエリを取得します*/
$query = call_user_func_array(array($this, コンパイル), $args); } その他 {
/*ストアド プロシージャは初期化されていないため、標準クエリとして実行されます*/
$query = $queryParams
; }
$result = $this->db->query($query); if (! $result) {
新しいQueryException($this)をスローします



http://www.bkjia.com/PHPjc/508484.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/508484.html技術記事 1. DBQuery オブジェクト DBQuery オブジェクトは単にストアド プロシージャを模倣するもので、実行されると結果リソースが返されます。その結果を使用したい場合は...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート