Zend Framework Graphics の単純なファクトリ パターン_PHP チュートリアル
ZF を少し前に使ったことがありますが、それをブラックボックスとして扱うのはあまり気分が良くなく、常にソースコードを見たいという衝動に駆られていました。 。 。少しずつ見てみると、課題は確かに非常に大きいです。ある日、長い間デザインパターンをレビューしていないことに気づきました。要約すると、設計パターンを確認した後、そのパターンを使用するソース コードを ZF で探します。ソース コードをすべて読むのではなく、パターンに関してはより「高度な」部分を読みます。すべてのパターンが ZF に含まれているかどうかはわかりませんが、最近調べたところ、十分なパターンがあるはずです。パターンを見つけるために他のオープンソース ソフトウェアを探すことができると思います。この間、あらゆる種類の筆記試験で私の生活は少々混乱しましたが、何はともあれ復習は必要です。もう一度 ZF について話しましょう。ZF の利点の 1 つは、各コンポーネントが比較的独立しており、コンポーネント間の依存性があまりないことです。これにより、ユーザーに利便性が提供されますが、もちろん、退屈な人や怠け者にも利便性が提供されます。私のようにソースコードを読みたい人にとっては便利です。
今日はシンプルなファクトリーを見てみましょう。ZF にはファクトリーパターンはもちろんのこと、Ctrl+H (zend スタジオの下) を押すと簡単なファクトリーが見つかります。ご想像のとおり、工場はたくさんありますが、そのほとんどは単純な工場であるはずです。 Zend_Db が最も一般的に使用されているため、当然その実装を見てみたいと思います。ソース コードを表示する前に、まず Zend_Db と単純なファクトリの使用方法を確認してください (これはスタックです。最初に単純なファクトリを確認してください)。
単純なファクトリ パターンを確認します
クラス図を使用して、単純なファクトリ クラス図を思い出してください:
1. Zend_Db の使い方を復習する
XXX のソースコードを見るのはちょっと恥ずかしいけど、XXX の使い方がわからないという方は、簡単に見てみましょう。 Zend_Db の使用については、次の段落が ZF 公式ドキュメントにあります (私は個人的に ZF ドキュメントはあまり好きではありません。ZF ドキュメントは Yii ほど読みやすくありません)
/public/index.php
$db = Zend_Db::factory('Pdo_Mysql', array(
'host' => '127.0.0.1',
'username' => 'webuser',
'パスワード' => 'xxxxxxxx',
'dbname' => 'test'
上記により、$db (Zend_Db オブジェクト) が生成されます。上記の $db を使用して、次のようにクエリします:
$result = $db->fetchAssoc(
'SELECT bug_id, bug_description, bug_status FROM bugs'
);公式 Web サイトのドキュメントから引用したものです。これはフェッチ レコードです。モードはオブジェクトで、次にフェッチです。今ではすべてが自然に見えますが、これまでのところ、まだ Zend_Db をブラック ボックスとして使用しています
class Zend_Db
{
/**
いくつかの定数とデフォルト値を設定します
*/
/**
* Zend_Db_Adapter_Abstract クラスのファクトリー。
*
* 最初の引数は、アダプター クラス
* 名のベースを含む文字列にすることができます。 「Mysqli」はクラス Zend_Db_Adapter_Mysqli に対応します。この
* 名は現在大文字と小文字が区別されませんが、この動作に依存するのは理想的ではありません。
* クラスの名前が 'My_Company_Pdo_Mysql' ('My_Company' は名前空間
*、'Pdo_Mysql' はアダプター名) の場合、クラスで定義されている名前
* を正確に使用することが最善です。これにより、ファクトリ API が適切に使用されるようになります。
*
* 最初の引数は、Zend_Config 型のオブジェクトにすることもできます。
* アダプター クラスの基本名は、「アダプター」プロパティから読み取られます。
* アダプターの構成パラメーターは、「params」プロパティから読み取られます。
*
* 2 番目の引数はオプションであり、キーと値のペアの連想配列
* を指定できます。これは、アダプター コンストラクターへの引数として使用されます。
*
* 最初の引数が Zend_Config 型の場合、それには
* すべてのパラメータが含まれているとみなされ、2 番目の引数は無視されます。
*
* @parammixed $adapter 基本アダプター クラスまたは Zend_Config オブジェクトの文字列名。
* @param 混合 $config オプション;アダプターパラメーターを含む配列または Zend_Config オブジェクト。
* @return Zend_Db_Adapter_Abstract
* @throws Zend_Db_Exception
*/
public static function Factory ($adapter, $config = array())
{
//Zend_Config对象を使用します。上記の方法は使用せず、Array を直接使用します
if ($config instanceof Zend_Config) {
$config = $config->toArray();
}
/*
* Zend_Config 引数をプレーン文字列
* アダプター名と別の構成オブジェクトに変換します。
*/
if ($adapterinstanceof Zend_Config) {
if (isset($adapter->params)) {
$config = $adapter->params->toArray();
}
if (isset($adapter->adapter)) {
$adapter = (文字列) $adapter->adapter;
} else {
$adapter = null;
}
}
/*
* アダプターのパラメーターが配列内にあることを確認します。
*/
if (! is_array($config)) {
/**
* @Zend_Db_Exception を参照
*/
require_once 'Zend/Db/Exception.php';
throw new Zend_Db_Exception(
'アダプター パラメーターは配列または Zend_Config オブジェクト内にある必要があります');
}
/*
* アダプター名が指定されていることを確認します。
*/
if (! is_string($adapter) || empty($adapter)) {
/**
* @Zend_Db_Exception を参照
*/
require_once 'Zend/Db/Exception.php';
throw new Zend_Db_Exception(
'アダプター名は文字列で指定する必要があります');
}
/*
* フォームの完全なアダプター クラス名
*/
$adapterNamespace = 'Zend_Db_Adapter';
if (isset($config['adapterNamespace'])) {
if ($config['adapterNamespace'] != '') {
$adapterNamespace = $config['adapterNamespace'];
}
unset($config['adapterNamespace']);
}
// アダプターは正規化されなくなりました。 http://framework.zend.com/issues/browse/ZF-5606 を参照してください。
$adapterName = $adapterNamespace 。 '_';
$adapterName .= str_replace(' ', '_',
ucwords(str_replace('_', ' ', strto lower($adapter))));
/*
* アダプター クラスをロードします。指定されたクラスをロードできない場合は、例外
* がスローされます。
*/
if (! class_exists($adapterName)) {
require_once 'Zend/Loader.php';
Zend_Loader::loadClass($adapterName);
}
/*
* アダプター クラスのインスタンスを作成します。
* 設定をアダプター クラスのコンストラクターに渡します。
*/
$dbAdapter = 新しい $adapterName($config);
/*
* 作成されたオブジェクトが抽象アダプター型の子孫であることを確認します。
*/
if (! $dbAdapter instanceof Zend_Db_Adapter_Abstract) {
/**
* @Zend_Db_Exception を参照
*/
require_once 'Zend/Db/Exception.php';
throw new Zend_Db_Exception(
"アダプター クラス '$adapterName' は Zend_Db_Adapter_Abstract を拡張しません");
}
$dbAdapter を返します。
}
}
最上の注釈は非常に得られた、明確な説明はこの工厂、外一段比重要な几代码(忽略その中の常处処理)は:
//factory にはパラメータが一つあります $adapter
public static function Factory($adapter, $config = array())
//确定名前空間
$adapterNamespace = 'Zend_Db_Adapter';
//namespace と上面に入力された $adapter 構造名
$adapterName = $adapterNamespace 。 '_';
$adapterName .= str_replace(' ', '_', ucwords(str_replace('_', ' ', strto lower($adapter))));
//上面で生成されたクラス名newoutobj,見る起来PHP比java方便那么一点哈(Class.forName(‘XXX’).newInstance())
$dbAdapter = new $adapterName($config);
$db を生成するために Zend_Db::factory が使用された上記の場所を思い出してください:
$db = Zend_Db::factory('Pdo_Mysql', array(
) 'ホスト' => '127.0.0.1',
'ユーザー名' => 'xxxxxxxx',
'データベース名' =>
factory メソッドの最初 最初のパラメーターは、$adapter が Pdo_Mysql であることを思い出してください。上記の $adapterNamespace = 'Zend_Db_Adapter' によれば、最終的に $dbAdapter の値は次のようになります。 、この名前に従って、zend/db/adapter/pdo ディレクトリを見つけます。はは、おなじみの顔がたくさんあり、MySql、Mssql、Sqlite などの懐かしい顔も見ました。

さて、クラス名 Zend_Db_Adapter_Pdo_Mysql は、上記で生成されたクラス名と同じです。それらはすべて Zend_Db_Adapter_Pdo_Abstract を継承しています。描きたいならクラス図、次のようなクラス図が必要です:
次に、クライアント関数とファクトリー関数が配置されている場所に Zend_Db を追加します。この単純なクラス図は、非常に純粋なものになります。シンプルファクトリーはこんな感じになりました(シンプルファクトリーのクラス図みたいになってませんか?クラスの位置が間違ってるだけです)。

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

truehttp://www.bkjia.com/PHPjc/325670.html

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











WeChat のサイレント モードとはどういう意味ですか? 現在、スマートフォンの人気とモバイル インターネットの急速な発展により、ソーシャル メディア プラットフォームは人々の日常生活に欠かせないものとなっています。 WeChat は中国で最も人気のあるソーシャル メディア プラットフォームの 1 つであり、ほとんどの人が WeChat アカウントを持っています。私たちは WeChat を通じて友人、家族、同僚とリアルタイムでコミュニケーションを取り、生活の瞬間を共有し、お互いの現在の状況を理解することができます。しかし、この時代では、特に集中力や集中力が必要な人々にとって、情報過多やプライバシー漏洩の問題にも必然的に直面します。

ハードディスクのシリアル番号はハードディスクの重要な識別子であり、通常、ハードディスクを一意に識別し、ハードウェアを識別するために使用されます。場合によっては、オペレーティング システムのインストール時、正しいデバイス ドライバーの検索時、ハード ドライブの修復の実行時など、ハード ドライブのシリアル番号を照会する必要があることがあります。この記事では、ハードドライブのシリアル番号を確認する簡単な方法をいくつか紹介します。方法 1: Windows コマンド プロンプトを使用してコマンド プロンプトを開きます。 Windows システムでは、Win+R キーを押し、「cmd」と入力し、Enter キーを押してコマンドを開きます。

iOS デバイスでは、ヘルスケア アプリを使用して睡眠パターンなどを追跡できるようになってきました。でも、寝ているときに通知が来ると煩わしくありませんか?これらの通知は無関係である可能性があるため、その過程で睡眠パターンが混乱します。おやすみモードは、睡眠中に気を散らすのを避けるための優れた方法ですが、夜間に受信する重要な電話やメッセージを見逃す可能性があります。ありがたいことに、ここでスリープモードが登場します。それについてさらに詳しく、そしてiPhoneでそれを使用する方法を学びましょう。 iPhone ではスリープ モードはどのような役割を果たしますか? スリープ モードは iOS 専用のフォーカス モードで、「ヘルスケア」アプリの睡眠スケジュールに基づいて自動的に有効になります。アラームを設定するのに役立ちます。

イヤホンは今日の生活に非常に普及しており、すべてのユーザーが使用するスマートデバイスですが、r が左のイヤホンか右のイヤホンかに興味があるユーザーもいます。ヘッドフォンのrとlの意味をそれぞれ見てみましょう。 r が左のイヤホンか右のイヤホンかをどのように判断しますか? 答え: 右耳です。 1. ヘッドセットの R は右の略語、L は左の略語です; 2. ヘッドセット上の L と R の文字ロゴを探し、それらを区別するために L と R の文字を見つけます; 3. 一部のヘッドセットでは、 R を区別する 赤でマークされている、マイクとボタンのある側は通常右側です。

おやすみモードで電話に応答することさえ、非常に煩わしい経験になる可能性があります。名前が示すように、おやすみモードでは、すべての着信通知と電子メール、メッセージなどからの警告がオフになります。これらのソリューション セットに従って問題を修正できます。解決策 1 – フォーカス モードを有効にする 携帯電話でフォーカス モードを有効にします。ステップ 1 – 上から下にスワイプしてコントロール センターにアクセスします。ステップ 2 – 次に、携帯電話の「フォーカスモード」を有効にします。フォーカス モードでは、電話機のサイレント モードが有効になります。携帯電話に着信通知が表示されることはありません。解決策 2 – フォーカス モード設定を変更する フォーカス モード設定に問題がある場合は、修正する必要があります。ステップ 1 – iPhone の設定ウィンドウを開きます。ステップ 2 – 次に、フォーカス モード設定をオンにします

PHP による簡単なオンライン予約システムの作成方法 インターネットの普及とユーザーの利便性の追求により、オンライン予約システムはますます普及しています。レストラン、病院、美容室、その他のサービス業であっても、シンプルなオンライン予約システムにより効率が向上し、ユーザーにより良いサービス体験を提供できます。この記事では、PHP を使用して簡単なオンライン予約システムを作成する方法と、具体的なコード例を紹介します。データベースとテーブルの作成 まず、予約情報を保存するデータベースを作成する必要があります。 MySで

S モードの Windows は、Microsoft Store からのアプリのインストールのみを許可することで、セキュリティとパフォーマンスが強化されるように設計されています。この機能はマルウェアを防止し、安全なコンピューティング環境を確保するのに役立ちますが、Microsoft Store 以外のソースからアプリケーションをインストールしたいユーザーが制限される可能性があります。このような状況に陥り、Windows 10/11 で S モードから切り替える方法を自問し続けている場合は、2 つの異なるモードを使用して Windows 10/11 で S モードから切り替える方法を説明するので、ここは正しい場所に来ています。 S モードに移行すると、どこからでもアプリを自由にインストールできるようになります。 Windows で S モードを終了する方法を学習します。

Java を使用して簡単な生徒の成績レポート ジェネレーターを作成するにはどうすればよいですか? Student Performance Report Generator は、教師または教育者が生徒の成績レポートを迅速に作成するのに役立つツールです。この記事では、Java を使用して簡単な生徒の成績レポート ジェネレーターを作成する方法を紹介します。まず、学生オブジェクトと学生成績オブジェクトを定義する必要があります。学生オブジェクトには学生の名前や学生番号などの基本情報が含まれ、学生スコア オブジェクトには学生の科目のスコアや平均成績などの情報が含まれます。以下は、単純な Student オブジェクトの定義です。
