Rumah pembangunan bahagian belakang tutorial php Zend Framework中的简单工厂模式 图文_PHP教程

Zend Framework中的简单工厂模式 图文_PHP教程

Jul 21, 2016 pm 03:17 PM
framework zend tidak Grafik dan teks kilang mempunyai model tengok Mudah

前段时间用来ZF,把他当黑盒感觉不是很好,一直有看其源码的冲动,但是。。。如果一点一点点看的话,挑战确实有些大了。某天又然后想到好久没复习设计模式了。综合一下,复习一个设计模式之后在ZF中找一下使用这模式的源码吧,不读所有源码,读读比较”高级”的部分吧,要说模式,暂时不知道是不是所有模式ZF里面都有,但是应该有足够的模式够我最近看了,在说可以找找其他开源的软件来找模式。这段时间被各种笔试神马乱七八糟的把生活搞得稍微有点乱,但是不管怎样,复习还是必须的吧。再说一下ZF吧,ZF一个好处就是各个component比较独立,component之间没有过多的依赖,这样一来,为使用者提供了方便,当然也为我这样无聊且懒的想看源码的人提供了方便。

今天看看简单工厂,ZF里面不缺模式,更不缺工厂模式,大名鼎鼎的的 Zend_Db就毫不吝啬的使用简单工厂,再ctrl+h(zend studio下)一下会发现factory特别多,如果没猜错应该大多应该也是简单工厂。由于Zend_Db 最常用,我也就自然的会比较想看一下他的实现。在查看源码之前先复习一下怎么用Zend_Db和简单工厂(这里是一个stack,先复习简单工厂)。

复习简单工厂模式
用类图回忆一下,简单工厂类图:

借用《研磨设计模式》作者的一张图,可以看到Client通过factory来获取对象,通过Api结构来调用。用factory把具体的Api的创建隐藏起来。而其他所有使用者在使用时,只需要知道用factory创建,通过Api结构调用即可,简单复习完成。看到类图应该能想起简单工厂了,因为他本身确实很简单。复习完简单工厂,思维稍微跳跃一下,直接来看看Zend_Db的使用。
1.复习Zend_Db的使用
如果不知道如何使用,准备看XXX的源码却不知道怎么用XXX,这有点囧,所以先小小的看一下Zend_Db的使用,下面这段是在ZF官方文档里面的(个人不是很喜欢ZF文档,没Yii易读)
/public/index.php
复制代码 代码如下:

$db = Zend_Db::factory('Pdo_Mysql', array(
'host' => '127.0.0.1',
'username' => 'webuser',
'password' => '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'
);

继续来自官网文档,这是取记录的模式为Object,再fetch,一切目前看起来都自然而然,但是至今还是把它Zend_Db当作一个黑盒使用。下面可以进入正题。
首先,查看一下zend/Db.php的代码摘要:
复制代码 代码如下:

class Zend_Db
{
/**
设定一些常量和默认值
*/
/**
* Factory for Zend_Db_Adapter_Abstract classes.
*
* First argument may be a string containing the base of the adapter class
* name, e.g. 'Mysqli' corresponds to class Zend_Db_Adapter_Mysqli. This
* name is currently case-insensitive, but is not ideal to rely on this behavior.
* If your class is named 'My_Company_Pdo_Mysql', where 'My_Company' is the namespace
* and 'Pdo_Mysql' is the adapter name, it is best to use the name exactly as it
* is defined in the class. This will ensure proper use of the factory API.
*
* First argument may alternatively be an object of type Zend_Config.
* The adapter class base name is read from the 'adapter' property.
* The adapter config parameters are read from the 'params' property.
*
* Second argument is optional and may be an associative array of key-value
* pairs. This is used as the argument to the adapter constructor.
*
* If the first argument is of type Zend_Config, it is assumed to contain
* all parameters, and the second argument is ignored.
*
* @param mixed $adapter String name of base adapter class, or Zend_Config object.
* @param mixed $config OPTIONAL; an array or Zend_Config object with adapter parameters.
* @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();
}
/*
* Convert Zend_Config argument to plain string
* adapter name and separate config object.
*/
if ($adapter instanceof Zend_Config) {
if (isset($adapter->params)) {
$config = $adapter->params->toArray();
}
if (isset($adapter->adapter)) {
$adapter = (string) $adapter->adapter;
} else {
$adapter = null;
}
}
/*
* Verify that adapter parameters are in an array.
*/
if (! is_array($config)) {
/**
* @see Zend_Db_Exception
*/
require_once 'Zend/Db/Exception.php';
throw new Zend_Db_Exception(
'Adapter parameters must be in an array or a Zend_Config object');
}
/*
* Verify that an adapter name has been specified.
*/
if (! is_string($adapter) || empty($adapter)) {
/**
* @see Zend_Db_Exception
*/
require_once 'Zend/Db/Exception.php';
throw new Zend_Db_Exception(
'Adapter name must be specified in a string');
}
/*
* Form full adapter class name
*/
$adapterNamespace = 'Zend_Db_Adapter';
if (isset($config['adapterNamespace'])) {
if ($config['adapterNamespace'] != '') {
$adapterNamespace = $config['adapterNamespace'];
}
unset($config['adapterNamespace']);
}
// Adapter no longer normalized- see http://framework.zend.com/issues/browse/ZF-5606
$adapterName = $adapterNamespace . '_';
$adapterName .= str_replace(' ', '_',
ucwords(str_replace('_', ' ', strtolower($adapter))));
/*
* Load the adapter class. This throws an exception
* if the specified class cannot be loaded.
*/
if (! class_exists($adapterName)) {
require_once 'Zend/Loader.php';
Zend_Loader::loadClass($adapterName);
}
/*
* Create an instance of the adapter class.
* Pass the config to the adapter class constructor.
*/
$dbAdapter = new $adapterName($config);
/*
* Verify that the object created is a descendent of the abstract adapter type.
*/
if (! $dbAdapter instanceof Zend_Db_Adapter_Abstract) {
/**
* @see Zend_Db_Exception
*/
require_once 'Zend/Db/Exception.php';
throw new Zend_Db_Exception(
"Adapter class '$adapterName' does not extend Zend_Db_Adapter_Abstract");
}
return $dbAdapter;
}
}

最上方的注释非常值得看,它清楚的说明了这个工厂,另外一段比较重要的几段代码(忽略其中的异常处理)是:
复制代码 代码如下:

//factory有一个参数叫做$adapter
public static function factory($adapter, $config = array())

//确定namespace
$adapterNamespace = 'Zend_Db_Adapter';

//用namespace和上面传入的$adapter构造类名
$adapterName = $adapterNamespace . '_';
$adapterName .= str_replace(' ', '_', ucwords(str_replace('_', ' ', strtolower($adapter))));

//用上面生成的类名new出obj,看起来PHP比java方便那么一点点哈(Class.forName(‘XXX').newInstance())
$dbAdapter = new $adapterName($config);

在回想上面使用Zend_Db::factory生成$db的地方:
复制代码 代码如下:

$db = Zend_Db::factory('Pdo_Mysql', array(
'host' => '127.0.0.1',
'username' => 'webuser',
'password' => 'xxxxxxxx',
'dbname' => 'test'
));

factory方法的第一个参数即是$adapter为Pdo_Mysql,记住这里是Pdo_Mysql,再跳跃一下,根据上面的$adapterNamespace = ‘Zend_Db_Adapter';可以看到生成的找到$dbAdapter的值最终必为:Zend_Db_Adapter_Pdo_Mysql,ok,根据此名字找到zend/db/adapter/pdo目录下,哈,这么多熟悉的面孔,看到了熟悉的MySql、Mssql、Sqlite这些老面孔了。


注意,注意,里面还有个低调的Abstract.php,里面他们的父类Zend_Db_Adapter_Pdo_Abstract。打开Mysql.php可以看到
class Zend_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Abstract

嗯,类名Zend_Db_Adapter_Pdo_Mysql和上面生成的名字一样滴,在看看其他几个文件里面的类,他们都继承自Zend_Db_Adapter_Pdo_Abstract,如果要画类图,那就应该会有如下这么一张类图:

接着再加入调用着Client和工厂函数所在的位置Zend_Db,这张简单的类图就应该是,

一个非常非常纯净的简单工厂就这么出来了(不像简单工厂类图吗?那只是因为类的位置没放好)。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/325670.htmlTechArticle前段时间用来ZF,把他当黑盒感觉不是很好,一直有看其源码的冲动,但是。。。如果一点一点点看的话,挑战确实有些大了。某天又然后想...
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah yang dilakukan oleh mod Jangan Ganggu WeChat? Apakah yang dilakukan oleh mod Jangan Ganggu WeChat? Feb 23, 2024 pm 10:48 PM

Apakah maksud mod Jangan Ganggu WeChat Pada masa kini, dengan populariti telefon pintar dan perkembangan pesat Internet mudah alih, platform media sosial telah menjadi bahagian yang amat diperlukan dalam kehidupan seharian orang ramai. WeChat ialah salah satu platform media sosial paling popular di China, dan hampir semua orang mempunyai akaun WeChat. Kita boleh berkomunikasi dengan rakan, keluarga dan rakan sekerja dalam masa nyata melalui WeChat, berkongsi detik dalam hidup kita dan memahami situasi semasa satu sama lain. Namun begitu, dalam era ini, sudah pasti kita juga berdepan dengan masalah sarat maklumat dan kebocoran privasi terutamanya bagi mereka yang perlu fokus atau

Cara paling mudah untuk menanyakan nombor siri cakera keras Cara paling mudah untuk menanyakan nombor siri cakera keras Feb 26, 2024 pm 02:24 PM

Nombor siri cakera keras ialah pengecam penting cakera keras dan biasanya digunakan untuk mengenal pasti cakera keras secara unik dan mengenal pasti perkakasan. Dalam sesetengah kes, kami mungkin perlu menanyakan nombor siri cakera keras, seperti semasa memasang sistem pengendalian, mencari pemacu peranti yang betul atau melakukan pembaikan cakera keras. Artikel ini akan memperkenalkan beberapa kaedah mudah untuk membantu anda menyemak nombor siri cakera keras. Kaedah 1: Gunakan Windows Command Prompt untuk membuka command prompt. Dalam sistem Windows, tekan kekunci Win+R, masukkan "cmd" dan tekan kekunci Enter untuk membuka arahan

Apakah mod tidur digunakan pada iPhone? Apakah mod tidur digunakan pada iPhone? Nov 04, 2023 am 11:13 AM

Peranti iOS telah lama dapat menjejaki corak tidur anda dan banyak lagi menggunakan apl Kesihatan. Tetapi bukankah ia menjengkelkan apabila anda diganggu oleh pemberitahuan semasa anda sedang tidur? Pemberitahuan ini mungkin tidak relevan dan oleh itu mengganggu corak tidur anda dalam proses. Walaupun mod Jangan Ganggu ialah cara terbaik untuk mengelakkan gangguan semasa tidur, ia boleh menyebabkan anda terlepas panggilan dan mesej penting yang anda terima pada waktu malam. Syukurlah, di sinilah mod tidur masuk. Mari ketahui lebih lanjut mengenainya dan cara menggunakannya pada iPhone. Apakah peranan yang dimainkan oleh mod tidur pada iPhone Mod tidur ialah mod fokus khusus dalam iOS yang diaktifkan secara automatik berdasarkan jadual tidur anda dalam apl "Kesihatan". Ia membantu anda menetapkan penggera dan kemudian

Bagaimana untuk mengetahui sama ada r ialah fon telinga kiri atau kanan? Bagaimana untuk mengetahui sama ada r ialah fon telinga kiri atau kanan? Feb 05, 2024 pm 05:42 PM

Fon telinga adalah sangat biasa dalam kehidupan hari ini dan merupakan peranti pintar yang digunakan oleh setiap pengguna Sesetengah pengguna ingin tahu sama ada r ialah fon telinga kiri atau kanan. Mari kita lihat maksud fon kepala r dan l masing-masing. Bagaimanakah anda mengetahui sama ada r ialah fon telinga kiri atau kanan. 1. R pada set kepala ialah singkatan dari kanan, L ialah singkatan dari kiri 2. Cari logo huruf L dan R pada set kepala, dan cari huruf L dan R untuk membezakannya; bezakan R Ditandakan dengan warna merah, bahagian tepi dengan mikrofon dan butang biasanya di sebelah kanan;

Mod Jangan Ganggu Tidak Berfungsi dalam iPhone: Betulkan Mod Jangan Ganggu Tidak Berfungsi dalam iPhone: Betulkan Apr 24, 2024 pm 04:50 PM

Malah menjawab panggilan dalam mod Jangan Ganggu boleh menjadi pengalaman yang sangat menjengkelkan. Seperti namanya, mod Jangan Ganggu mematikan semua pemberitahuan panggilan masuk dan makluman daripada e-mel, mesej, dsb. Anda boleh mengikuti set penyelesaian ini untuk membetulkannya. Betulkan 1 – Dayakan Mod Fokus Dayakan mod fokus pada telefon anda. Langkah 1 – Leret ke bawah dari atas untuk mengakses Pusat Kawalan. Langkah 2 – Seterusnya, dayakan “Mod Fokus” pada telefon anda. Mod Fokus mendayakan mod Jangan Ganggu pada telefon anda. Ia tidak akan menyebabkan sebarang makluman panggilan masuk muncul pada telefon anda. Betulkan 2 – Tukar Tetapan Mod Fokus Jika terdapat beberapa isu dalam tetapan mod fokus, anda harus membetulkannya. Langkah 1 – Buka tetingkap tetapan iPhone anda. Langkah 2 – Seterusnya, hidupkan tetapan mod Fokus

Bagaimana untuk menulis penjana laporan prestasi pelajar yang mudah menggunakan Java? Bagaimana untuk menulis penjana laporan prestasi pelajar yang mudah menggunakan Java? Nov 03, 2023 pm 02:57 PM

Bagaimana untuk menulis penjana laporan prestasi pelajar yang mudah menggunakan Java? Penjana Laporan Prestasi Pelajar ialah alat yang membantu guru atau pendidik menjana laporan prestasi pelajar dengan cepat. Artikel ini akan memperkenalkan cara menggunakan Java untuk menulis penjana laporan prestasi pelajar yang mudah. Pertama, kita perlu menentukan objek pelajar dan objek gred pelajar. Objek pelajar mengandungi maklumat asas seperti nama pelajar dan nombor pelajar, manakala objek skor pelajar mengandungi maklumat seperti skor mata pelajaran pelajar dan gred purata. Berikut ialah definisi objek pelajar mudah: awam

iPhone 15 Pro: Bagaimana untuk membuang simbol mod senyap dalam bar status iPhone 15 Pro: Bagaimana untuk membuang simbol mod senyap dalam bar status Sep 24, 2023 pm 10:01 PM

Pada model iPhone 15 Pro dan iPhone 15 Pro Max, Apple memperkenalkan butang tindakan boleh atur cara secara fizikal yang menggantikan suis deringan/senyap tradisional di atas butang kelantangan. Butang tindakan boleh diprogramkan untuk melaksanakan beberapa fungsi yang berbeza, tetapi keupayaan untuk bertukar antara mod senyap dan deringan tidak hilang. Secara lalai, tekan lama pada butang tindakan akan menyenyapkan peranti dan maklum balas sentuhan butang akan berdenyut tiga kali. Kedua-dua model iPhone 15 Pro akan memaparkan simbol loceng berpalang di sebelah masa dalam bar status untuk menunjukkan bahawa mod senyap/senyap diaktifkan, dan ia akan kekal sedemikian sehingga anda menekan lama butang Tindakan sekali lagi untuk menyahredam peranti. Jika anda lebih suka meletakkan iPhone anda dalam mod senyap

Bagaimana untuk meninggalkan mod S pada Windows 10/11 Bagaimana untuk meninggalkan mod S pada Windows 10/11 Aug 03, 2023 pm 08:17 PM

Windows dalam mod S direka untuk menyediakan keselamatan dan prestasi yang dipertingkatkan dengan hanya membenarkan pemasangan apl daripada Gedung Microsoft. Walaupun ciri ini membantu menghalang perisian hasad dan memastikan persekitaran pengkomputeran yang selamat, ciri ini mungkin mengehadkan pengguna yang ingin memasang aplikasi daripada sumber selain daripada Gedung Microsoft. Jika anda mendapati diri anda dalam situasi ini dan terus bertanya kepada diri sendiri bagaimana untuk keluar daripada Mod S dalam Windows 10/11, maka anda telah datang ke tempat yang betul kerana kami akan membimbing anda melalui cara untuk keluar dari Mod S dalam Windows 10/11 menggunakan dua kaedah berbeza Langkah ke Mod S memastikan anda boleh menikmati kebebasan memasang apl dari mana-mana sahaja yang anda pilih. Ketahui cara untuk keluar daripada mod S dalam Windows

See all articles