Zend Framework Graphics の単純なファクトリ パターン_PHP チュートリアル
ZF を少し前に使ったことがありますが、それをブラックボックスとして扱うのはあまり気分が良くなく、常にソースコードを見たいという衝動に駆られていました。 。 。少しずつ見てみると、課題は確かに非常に大きいです。ある日、長い間デザインパターンをレビューしていないことに気づきました。要約すると、設計パターンを確認した後、そのパターンを使用するソース コードを ZF で探します。ソース コードをすべて読むのではなく、パターンに関してはより「高度な」部分を読みます。すべてのパターンが ZF に含まれているかどうかはわかりませんが、最近調べたところ、十分なパターンがあるはずです。パターンを見つけるために他のオープンソース ソフトウェアを探すことができると思います。この間、あらゆる種類の筆記試験で私の生活は少々混乱しましたが、何はともあれ復習は必要です。もう一度 ZF について話しましょう。ZF の利点の 1 つは、各コンポーネントが比較的独立しており、コンポーネント間の依存性があまりないことです。これにより、ユーザーに利便性が提供されますが、もちろん、退屈な人や怠け者にも利便性が提供されます。私のようにソースコードを読みたい人にとっては便利です。
今日はシンプルなファクトリーを見てみましょう。ZF にはファクトリーパターンはもちろんのこと、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(
'host' => '127.0.0.1',
'username' => 'webuser',
'パスワード' => 'xxxxxxxx',
'dbname' => 'test'
上記により、$db (Zend_Db オブジェクト) が生成されます。上記の $db を使用して、次のようにクエリします:
$result = $db->fetchAssoc(
'SELECT bug_id, bug_description, bug_status FROM bugs'
);公式 Web サイトのドキュメントから引用したものです。これはフェッチ レコードです。モードはオブジェクトで、次にフェッチです。今ではすべてが自然に見えますが、これまでのところ、まだ Zend_Db をブラック ボックスとして使用しています
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_Mysql は、上記で生成されたクラス名と同じです。それらはすべて Zend_Db_Adapter_Pdo_Abstract を継承しています。描きたいならクラス図、次のようなクラス図が必要です:
次に、クライアント関数とファクトリー関数が配置されている場所に Zend_Db を追加します。この単純なクラス図は、非常に純粋なものになります。シンプルファクトリーはこんな感じになりました(シンプルファクトリーのクラス図みたいになってませんか?クラスの位置が間違ってるだけです)。

http://www.bkjia.com/PHPjc/325670.html

truehttp://www.bkjia.com/PHPjc/325670.html

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

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

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

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