ホームページ  >  記事  >  バックエンド開発  >  Zend Framework Graphics の単純なファクトリ パターン_PHP チュートリアル

Zend Framework Graphics の単純なファクトリ パターン_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:17:51946ブラウズ

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

今日はシンプルなファクトリーを見てみましょう。ZF にはファクトリーパターンはもちろんのこと、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(
'host' => '127.0.0.1',
'username' => 'webuser',
'パスワード' => 'xxxxxxxx',
'dbname' => 'test'

これは最も単純なようです (実際には残りは難しくありません) 、管理を容易にするためにデータベースが別の場所に配置されているだけです)、これは通常の状況では最良の方法ではありませんが、重要な点を強調するために、ここでは最も単純な方法が選択されています。 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 サイトのドキュメントから引用したものです。これはフェッチ レコードです。モードはオブジェクトで、次にフェッチです。今ではすべてが自然に見えますが、これまでのところ、まだ Zend_Db をブラック ボックスとして使用しています
まず、zend のコードの概要を見てください。 /Db.php:


コードをコピーします コードは次のとおりです:

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_Abstract を含む控えめな Abstract.php もあります。 Mysql.php を開くと、class Zend_Db_Adapter_Pdo_Mysql が Zend_Db_Adapter_Pdo_Abstract を拡張していることがわかります
さて、クラス名 Zend_Db_Adapter_Pdo_Mysql は、上記で生成されたクラス名と同じです。それらはすべて Zend_Db_Adapter_Pdo_Abstract を継承しています。描きたいならクラス図、次のようなクラス図が必要です:




次に、クライアント関数とファクトリー関数が配置されている場所に Zend_Db を追加します。この単純なクラス図は、非常に純粋なものになります。シンプルファクトリーはこんな感じになりました(シンプルファクトリーのクラス図みたいになってませんか?クラスの位置が間違ってるだけです)。
http://www.bkjia.com/PHPjc/325670.html
www.bkjia.com
tru​​e
http://www.bkjia.com/PHPjc/325670.html

技術記事 ZF を少し前に使ったことがありますが、それをブラックボックスとして扱うのはあまり気分が良くなく、常にソースコードを見たいという衝動に駆られていました。 。 。少しずつ見てみると、課題は確かに非常に大きいです。ある日、改めて思いました…
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。