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

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

Jul 21, 2016 pm 03:17 PM
framework zend いいえ グラフィックとテキスト 工場 持っている モデル 見て 単純

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

WeChat の「おやすみモード」は何をするのですか? WeChat の「おやすみモード」は何をするのですか? Feb 23, 2024 pm 10:48 PM

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

ハードドライブのシリアル番号を照会する最も簡単な方法 ハードドライブのシリアル番号を照会する最も簡単な方法 Feb 26, 2024 pm 02:24 PM

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

iPhoneのスリープモードは何に使用されますか? iPhoneのスリープモードは何に使用されますか? Nov 04, 2023 am 11:13 AM

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

r が左右のイヤホンかどうかを確認するにはどうすればよいですか? r が左右のイヤホンかどうかを確認するにはどうすればよいですか? Feb 05, 2024 pm 05:42 PM

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

iPhoneでサイレントモードが機能しない:修正 iPhoneでサイレントモードが機能しない:修正 Apr 24, 2024 pm 04:50 PM

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

PHP を使用して簡単なオンライン予約システムを作成する方法 PHP を使用して簡単なオンライン予約システムを作成する方法 Sep 26, 2023 pm 09:55 PM

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

Windows 10/11でSモードを終了する方法 Windows 10/11でSモードを終了する方法 Aug 03, 2023 pm 08:17 PM

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

Java を使用して簡単な生徒の成績レポート ジェネレーターを作成するにはどうすればよいですか? Java を使用して簡単な生徒の成績レポート ジェネレーターを作成するにはどうすればよいですか? Nov 03, 2023 pm 02:57 PM

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

See all articles