ZF を少し前に使ったことがありますが、それをブラックボックスとして扱うのはあまり気分が良くなく、常にソースコードを見たいという衝動に駆られていました。 。 。少しずつ見てみると、課題は確かに非常に大きいです。ある日、長い間デザインパターンをレビューしていないことに気づきました。要約すると、設計パターンを確認した後、そのパターンを使用するソース コードを ZF で探します。ソース コードをすべて読むのではなく、パターンに関してはより「高度な」部分を読みます。すべてのパターンが ZF に含まれているかどうかはわかりませんが、最近調べたところ、十分なパターンがあるはずです。パターンを見つけるために他のオープンソース ソフトウェアを探すことができると思います。この間、あらゆる種類の筆記試験で私の生活は少々混乱しましたが、何はともあれ復習は必要です。もう一度 ZF について話しましょう。ZF の利点の 1 つは、各コンポーネントが比較的独立しており、コンポーネント間の依存性があまりないことです。これにより、ユーザーに利便性が提供されますが、もちろん、退屈な人や怠け者にも利便性が提供されます。私のようにソースコードを読みたい人にとっては便利です。
今日は、ZF のパターンには事欠きません。有名な Zend_Db は、迷わず ctrl h (zend スタジオの下) を押します。私の推測が正しければ、そのほとんどは単純な工場であるはずです。 Zend_Db が最も一般的に使用されているため、当然その実装を見てみたいと思います。ソース コードを表示する前に、まず Zend_Db と単純なファクトリの使用方法を確認してください (これはスタックです。最初に単純なファクトリを確認してください)。
単純なファクトリ パターンを確認します。
クラス図を使用して、単純なファクトリ クラス図を思い出します。
コードをコピー コードは次のとおりです:
$db = Zend_Db::factory('Pdo_Mysql', array(
'ホスト' => '127.0.0.1'、
'ユーザー名' => 'webuser'、
'パスワード' => 'xxxxxxxx'、
'データベース名' => 'テスト'
) );
コードをコピーします コードは次のとおりです:
$db->setFetchMode(Zend_Db::FETCH_OBJ);
$result = $db-> ;fetchAssoc(
' SELECT bug_id, bug_description, bug_status FROM bugs'
);
コードをコピーします。 🎜>コードは次のとおりです:
< ?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('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 など、懐かしい顔がたくさんあります。