ホームページ >php教程 >php手册 >Zend Framework のシンプルなファクトリー パターン 画像とテキスト

Zend Framework のシンプルなファクトリー パターン 画像とテキスト

WBOY
WBOYオリジナル
2016-06-13 11:59:361027ブラウズ

ZF を少し前に使ったことがありますが、それをブラックボックスとして扱うのはあまり気分が良くなく、常にソースコードを見たいという衝動に駆られていました。 。 。少しずつ見てみると、課題は確かに非常に大きいです。ある日、長い間デザインパターンをレビューしていないことに気づきました。要約すると、設計パターンを確認した後、そのパターンを使用するソース コードを ZF で探します。ソース コードをすべて読むのではなく、パターンに関してはより「高度な」部分を読みます。すべてのパターンが ZF に含まれているかどうかはわかりませんが、最近調べたところ、十分なパターンがあるはずです。パターンを見つけるために他のオープンソース ソフトウェアを探すことができると思います。この間、あらゆる種類の筆記試験で私の生活は少々混乱しましたが、何はともあれ復習は必要です。もう一度 ZF について話しましょう。ZF の利点の 1 つは、各コンポーネントが比較的独立しており、コンポーネント間の依存性があまりないことです。これにより、ユーザーに利便性が提供されますが、もちろん、退屈な人や怠け者にも利便性が提供されます。私のようにソースコードを読みたい人にとっては便利です。

今日は、ZF のパターンには事欠きません。有名な Zend_Db は、迷わず ctrl h (zend スタジオの下) を押します。私の推測が正しければ、そのほとんどは単純な工場であるはずです。 Zend_Db が最も一般的に使用されているため、当然その実装を見てみたいと思います。ソース コードを表示する前に、まず Zend_Db と単純なファクトリの使用方法を確認してください (これはスタックです。最初に単純なファクトリを確認してください)。

単純なファクトリ パターンを確認します。
クラス図を使用して、単純なファクトリ クラス図を思い出します。

「Grinding Design Pattern」の著者から画像を拝借すると、クライアントがファクトリを通じてオブジェクトを取得し、API 構造を通じてそれを呼び出していることがわかります。特定の API の作成を非表示にするには、factory を使用します。他のすべてのユーザーがそれを使用する場合、ファクトリでそれを作成し、API 構造を通じて呼び出す方法を知るだけで、簡単なレビューが完了します。クラス図を見たときは、単純なファクトリーを思い浮かべてください。それは実際に非常に単純だからです。単純なファクトリーを確認した後、少しだけ本題に入り、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 を追加します。

非常に純粋な単純なファクトリがこのように表示されます (単純なファクトリのクラス図のように見えませんか?それはクラスが適切に配置されていないだけです)。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。