ZF を少し前に使ったことがありますが、それをブラックボックスとして扱うのはあまり気分が良くなく、常にソースコードを見たいという衝動に駆られていました。 。 。少しずつ見てみると、課題は確かに非常に大きいです。ある日、長い間デザインパターンをレビューしていないことに気づきました。要約すると、設計パターンを確認した後、そのパターンを使用するソース コードを ZF で探します。ソース コードをすべて読むのではなく、パターンに関してはより「高度な」部分を読みます。すべてのパターンが ZF に含まれているかどうかはわかりませんが、最近調べたところ、十分なパターンがあるはずです。パターンを見つけるために他のオープンソース ソフトウェアを探すことができると思います。この間、あらゆる種類の筆記試験で私の生活は少々混乱しましたが、何はともあれ復習は必要です。もう一度 ZF について話しましょう。ZF の利点の 1 つは、各コンポーネントが比較的独立しており、コンポーネント間の依存性があまりないことです。これにより、ユーザーに利便性が提供されますが、もちろん、退屈な人や怠け者にも利便性が提供されます。私のようにソースコードを読みたい人にとっては便利です。
今日は、ZF のパターンには事欠きません。有名な Zend_Db は、迷わず 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(
'ホスト' => '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 のコードの概要を確認します。
コードをコピーします。 🎜>コードは次のとおりです:
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 を追加します。
非常に純粋な単純なファクトリがこのように表示されます (単純なファクトリのクラス図のように見えませんか?それはクラスが適切に配置されていないだけです)。

.NETFramework4是开发人员和最终用户在Windows上运行最新版本的应用程序所必需的。但是,在下载安装.NETFramework4时,许多用户抱怨安装程序在中途停止,显示以下错误消息-“ .NETFramework4hasnotbeeninstalledbecauseDownloadfailedwitherrorcode0x800c0006 ”。在您的设备上安装.NETFramework4时,如果您也在体验它,那么您就来对了地方

每当您的Windows11或Windows10PC出现升级或更新问题时,您通常会看到一个错误代码,指示故障背后的实际原因。但是,有时,升级或更新失败可能不会显示错误代码,这时就会出现混淆。有了方便的错误代码,您就可以确切地知道问题出在哪里,因此您可以尝试修复。但是由于没有出现错误代码,因此识别问题并解决它变得极具挑战性。这会占用您大量时间来简单地找出错误背后的原因。在这种情况下,您可以尝试使用Microsoft提供的名为SetupDiag的专用工具,该工具可帮助您轻松识别错误背后的真
![SCNotification 已停止工作 [修复它的 5 个步骤]](https://img.php.cn/upload/article/000/887/227/168433050522031.png)
作为Windows用户,您很可能会在每次启动计算机时遇到SCNotification已停止工作错误。SCNotification.exe是一个微软系统通知文件,由于权限错误和点网故障等原因,每次启动PC时都会崩溃。此错误也以其问题事件名称而闻名。因此,您可能不会将其视为SCNotification已停止工作,而是将其视为错误clr20r3。在本文中,我们将探讨您需要采取的所有步骤来修复SCNotification已停止工作,以免它再次困扰您。什么是SCNotification.e

如何通过PHP编写一个简单的在线预约系统随着互联网的普及和用户对便利性的追求,在线预约系统越来越受到欢迎。无论是餐厅、医院、美容院还是其他服务行业,都可以通过一个简单的在线预约系统来提高效率并为用户提供更好的服务体验。本文将介绍如何使用PHP编写一个简单的在线预约系统,并提供具体的代码示例。创建数据库和表格首先,我们需要创建一个数据库来存储预约信息。在MyS

已安装Microsoft.NET版本4.5.2、4.6或4.6.1的MicrosoftWindows用户如果希望Microsoft将来通过产品更新支持该框架,则必须安装较新版本的Microsoft框架。据微软称,这三个框架都将在2022年4月26日停止支持。支持日期结束后,产品将不会收到“安全修复或技术支持”。大多数家庭设备通过Windows更新保持最新。这些设备已经安装了较新版本的框架,例如.NETFramework4.8。未自动更新的设备可能

快速入门:使用Go语言函数实现简单的图书管理系统引言:随着计算机科学领域的不断发展,软件应用的需求也越来越多样化。图书管理系统作为一种常见的管理工具,也成为很多图书馆、学校和企业必备的系统之一。在本文中,我们将使用Go语言函数来实现一个简单的图书管理系统。通过这个例子,读者可以学习到Go语言中函数的基本用法以及如何构建一个实用的程序。一、设计思路:我们首先来

如何使用PHP开发简单的文件管理功能简介:文件管理功能在很多Web应用中都是必不可少的一部分。它允许用户上传、下载、删除和展示文件,为用户提供了便捷的文件管理方式。本文将介绍如何使用PHP开发一个简单的文件管理功能,并提供具体的代码示例。一、创建项目首先,我们需要创建一个基本的PHP项目。在项目目录下创建以下文件:index.php:主页面,用于显示上传表

自我们谈论影响安装KB5012643forWindows11的用户的新安全模式错误以来已经过去了一周。这个讨厌的问题并没有出现在微软在发布当天发布的已知问题列表中,因此让所有人都感到意外。好吧,就在您认为情况不会变得更糟的时候,微软为安装此累积更新的用户投下了另一颗炸弹。Windows11Build22000.652导致更多问题因此,这家科技公司警告Windows11用户,他们在启动和使用某些.NETFramework3.5应用程序时可能会遇到问题。听起来很熟悉?不过请不要惊


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

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

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

WebStorm Mac版
便利なJavaScript開発ツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境
