Zend Framework のシンプルなファクトリー パターン 画像とテキスト
ZF を少し前に使ったことがありますが、それをブラックボックスとして扱うのはあまり気分が良くなく、常にソースコードを見たいという衝動に駆られていました。 。 。少しずつ見てみると、課題は確かに非常に大きいです。ある日、長い間デザインパターンをレビューしていないことに気づきました。要約すると、設計パターンを確認した後、そのパターンを使用するソース コードを ZF で探します。ソース コードをすべて読むのではなく、パターンに関してはより「高度な」部分を読みます。すべてのパターンが ZF に含まれているかどうかはわかりませんが、最近調べたところ、十分なパターンがあるはずです。パターンを見つけるために他のオープンソース ソフトウェアを探すことができると思います。この間、あらゆる種類の筆記試験で私の生活は少々混乱しましたが、何はともあれ復習は必要です。もう一度 ZF について話しましょう。ZF の利点の 1 つは、各コンポーネントが比較的独立しており、コンポーネント間の依存性があまりないことです。これにより、ユーザーに利便性が提供されますが、もちろん、退屈な人や怠け者にも利便性が提供されます。私のようにソースコードを読みたい人にとっては便利です。
今日は、ZF のパターンには事欠きません。有名な Zend_Db は、迷わず 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(
'ホスト' => '127.0.0.1'、
'ユーザー名' => 'webuser'、
'パスワード' => 'xxxxxxxx'、
'データベース名' => 'テスト'
) );
これもコードに組み込まれたデータベース構成です。内部では最も単純に見えます (実際には他のものは難しくありません。管理を容易にするためにデータベースが別の場所に配置されているだけです)通常の状況ではこれが最良の方法ではありませんが、重要な点を強調するために、ここでは最も単純な方法を選択します。 Zend_Db::factory('Pdo_Mysql'... この段落
は上記の $db (Zend_Db オブジェクト) を生成します。上記の $db を使用して次のようにクエリします:
コードをコピーします コードは次のとおりです:
$db->setFetchMode(Zend_Db::FETCH_OBJ);
$result = $db-> ;fetchAssoc(
' SELECT bug_id, bug_description, bug_status FROM bugs'
);
公式 Web サイトのドキュメントに引き続き、レコード モードを Object として取得してから取得します。 、今ではすべてが自然に思えますが、まだ Zend_Db をブラック ボックスとして使用します。
まず、zend/Db.php のコードの概要を確認します。
コードをコピーします。 🎜>コードは次のとおりです:
< ?php
class Zend_Db
{
/**
いくつかの定数とデフォルト値を設定します
*/
/**
* Zend_Db_Adapter_Abstract クラスのファクトリ。
*
* 最初の引数は、アダプター クラス
* 名のベースを含む文字列です。 「Mysqli」はクラス Zend_Db_Adapter_Mysqli に対応します。この
* 名は現在大文字と小文字が区別されませんが、この動作に依存するのは理想的ではありません。
* クラスの名前が「My_Company_Pdo_Mysql」である場合、「My_Company」は名前空間
*、「Pdo_Mysql」はアダプター名です。
* で定義されている名前を正確に使用することが最善です。クラス。これにより、ファクトリ API が適切に使用されるようになります。
*
* 最初の引数は、Zend_Config 型のオブジェクトにすることもできます。
* アダプター クラスの基本名は、「adapter」プロパティから読み取られます。
* アダプターの構成パラメーターは、「params」プロパティから読み取られます。
*
* 2 番目の引数はオプションで、キーと値の
* ペアの連想配列にすることができます。これは、アダプター コンストラクターへの引数として使用されます。
*
* 最初の引数が Zend_Config 型の場合、それには
* すべてのパラメータが含まれているとみなされ、2 番目の引数は無視されます。
*
* @parammixed $adapter 基本アダプター クラスまたは Zend_Config オブジェクトの文字列名。
* @parammixed$config オプション;アダプターパラメーターを含む配列または Zend_Config オブジェクト。
* @return Zend_Db_Adapter_Abstract
* @throws Zend_Db_Exception
*/
パブリック静的関数ファクトリー ($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->gt;params->toArray() ;
}
if (isset($adapter->adapter)) {
$adapter = (string) $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 = new $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 を拡張しません");
}
return $dbAdapter;
}
}
の最上位の注釈は、この作業工程を明確に示しており、重要な部分代コード (忽略その中の常套処理) は次のとおりです。
复制代码代码如下:
//factory有一个パラメータ呼做$adapter
public static function Factory($アダプター、$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 $アダプター名($config);
$db を生成するために Zend_Db::factory が使用された上記の場所を思い出してください:
コードをコピーします コードは次のとおりです:
$ db = Zend_Db::factory('Pdo_Mysql', array(
'host' => '127.0.0.1',
'username' => 'webuser',
'password' => 'xxxxxxxx',
'dbname' => 'test'
)); ファクトリ メソッドの最初のパラメータは Pdo_Mysql です。ここに Pdo_Mysql があることを思い出してください。上記の $adapterNamespace = 'Zend_Db_Adapter'; によれば、 $dbAdapter の生成値は最終的に次のようになります: Zend_Db_Adapter_Pdo_Mysql、わかりました、この名前に従って、zend/db/adapter を見つけてください。 /pdo ディレクトリには、MySql、Mssql、Sqlite など、懐かしい顔がたくさんあります。
注意してください。内部には、親クラス Zend_Db_Adapter_Pdo_Abstract を含む、控えめな Abstract.php もあります。 Mysql.php を開くと、
class Zend_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Abstract
まあ、クラス名 Zend_Db_Adapter_Pdo_Mysql は、上で生成された名前と同じです。他のいくつかのファイルのクラスを見ると、それらはすべて Zend_Db_Adapter_Pdo_A から継承しています。要約クラス図を描きたい場合は、次のようなクラス図が必要です:
次に、クライアント関数とファクトリー関数が呼び出される場所に Zend_Db を追加します。
非常に純粋な単純なファクトリがこのように表示されます (単純なファクトリのクラス図のように見えませんか?それはクラスが適切に配置されていないだけです)。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









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

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

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 – 次に、フォーカス モード設定をオンにします

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

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

iPhone 15 Pro および iPhone 15 Pro Max モデルで、Apple は、音量ボタンの上にある従来の着信音/サイレント スイッチに代わる、物理的にプログラム可能なアクション ボタンを導入しました。アクション ボタンは、いくつかの異なる機能を実行するようにプログラムできますが、サイレント モードと着信モードを切り替える機能はなくなっていません。デフォルトでは、アクション ボタンを長押しするとデバイスが沈黙し、ボタンの触覚フィードバックが 3 回脈動します。どちらの iPhone 15 Pro モデルでも、ステータス バーの時刻の横に取り消し線のベル記号が表示され、サイレント/サイレント モードが有効になっていることを示します。また、アクション ボタンを再度長押ししてデバイスのミュートを解除するまで、この状態が維持されます。 iPhoneをマナーモードにしたい場合
