《PHP設(shè)計(jì)模式介紹》第十章 規(guī)范模式(3)_PHP教程
推薦:《PHP設(shè)計(jì)模式介紹》第九章 觀測模式一些面向?qū)ο蟮木幊谭绞�,提供了一種構(gòu)建對(duì)象間復(fù)雜網(wǎng)絡(luò)互連的能力。當(dāng)對(duì)象們連接在一起時(shí),它們就可以相互提供服務(wù)和信息。 通常來說,當(dāng)某個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),你仍然需要對(duì)象之間能互
當(dāng)你的應(yīng)用程序必須加工處理一個(gè)表單,你可以先把$_POST過來的數(shù)據(jù)值裝載到數(shù)據(jù)源DataSource,然后使用參數(shù)化規(guī)范來完成表單的驗(yàn)證。(同樣的方法也可以用到配置文件上,把配置文件的數(shù)據(jù)裝載到DataSource數(shù)據(jù)源,然后使用規(guī)范來驗(yàn)證)。
現(xiàn)在,讓我們構(gòu)造一個(gè)參數(shù)化規(guī)范的示例類,主要用來搭建一個(gè)數(shù)據(jù)塊。首先,我們要建一個(gè)規(guī)范,這個(gè)規(guī)范得滿足“某一個(gè)字段和指定的值等價(jià)”的條件。
| class FieldEqualSpecification { protected $field; protected $value; public function __construct($field, $value) { $this->field = $field; $this->value = $value; } public function isSatisfiedBy($datasource) { return ($datasource->get($this->field) == $this->value); } } |
這個(gè)思路是很簡單的:在構(gòu)造(construction)期間,存儲(chǔ)一個(gè)字段和它期望的值,從數(shù)據(jù)源(DataSource)中獲取到期望的值傳遞到方法isSatisfiedBy(),然后比較。
為了測試這個(gè)規(guī)范,寫一個(gè)測試實(shí)例來演示這個(gè)數(shù)據(jù)源(DataSource):
| class SpecificationsTestCase extends UnitTestCase { protected $ds; function setup() { $this->ds = new DataSource; $this->ds->set(‘name’, ‘Jason’); $this->ds->set(‘age’, 34); $this->ds->set(‘email’, ‘[email protected]’); $this->ds->set(‘sex’, ‘male’); } } |
在上面的例子里,方法setup()創(chuàng)建了一個(gè)數(shù)據(jù)源對(duì)象,并設(shè)置了相應(yīng)的屬性。這個(gè)測試還包含一個(gè)方法,這個(gè)方法要么返回pass要么返回fail。
| class SpecificationsTestCase extends UnitTestCase { // ... function TestFieldEqualSpecification() { $name_jason = new FieldEqualSpecification(‘name’, ‘Jason’); $this->assertTrue($name_jason->isSatisfiedBy($this->ds)); $sex_other = new FieldEqualSpecification(‘sex’, ‘other’); $this->assertFalse($sex_other->isSatisfiedBy($this->ds)); } } |
通常在評(píng)估字符串的時(shí)候,一個(gè)正則表達(dá)式比一系列嚴(yán)格的比較關(guān)系能夠更好的幫助你來定義你的需求。那么,讓我們?cè)贔ieldMatchSpecification中使用正則表達(dá)式來匹配我們的規(guī)范工具集。
|
class FieldMatchSpecification { |
在這個(gè)例子里,這個(gè)字段對(duì)應(yīng)的值和PCRE表達(dá)式都在構(gòu)造的時(shí)候保存好了。然后方法isSatisfiedBy()從傳遞過來的數(shù)據(jù)源DataSource獲取到這個(gè)字段,并且使用preg_match()方法來比較它的值是否滿足對(duì)應(yīng)的正則表達(dá)式。
下面這個(gè)例子演示了如何為FieldMatchSpecification字段匹配規(guī)范書寫測試實(shí)例。
| class SpecificationsTestCase extends UnitTestCase { // ... function TestFieldMatchSpecification() { $valid_email = new FieldMatchSpecification( ‘email’, ‘/^[^\s@] @[^\s.] (?:\.[^\s.] ) /’); $this->assertTrue($valid_email->isSatisfiedBy($this->ds)); $name_ten_letters = new FieldMatchSpecification( ‘name’, ‘/^\w{10}$/’); $this->assertFalse($name_ten_letters->isSatisfiedBy($this->ds)); } } |
上面例子中的email正則要求“在@前是一串不包含空格、@的字符,在@后是兩組或者兩組以上不包含可個(gè)空格或者句點(diǎn)的字符串,這些字符串之間由句點(diǎn)間隔著”。而變量$name_ten_letters規(guī)范要求輸入的值必須恰好是由10個(gè)字符組成。
注:正則表達(dá)式
有許多書籍單獨(dú)開一章來講解正則表達(dá)式,甚至有些整本書都在討論這個(gè)話題(譯者注:作者是為了說明正則表達(dá)式的重要性和難度)。所以,請(qǐng)認(rèn)識(shí)到上面的代碼只是一個(gè)過于簡單化的例子,而不是一個(gè)檢查email的完善的正則表達(dá)式。
下面讓我們搭建最后一個(gè)具體的規(guī)范用來檢驗(yàn)一個(gè)字段值是否大于或者等于對(duì)應(yīng)的值。我們毫無疑問的把它命名為FieldGreaterThanOrEqualSpecification.。
| class FieldGreaterThanOrEqualSpecification { protected $field; protected $value; public function __construct($field, $value) { $this->field = $field; $this->value = $value; } public function isSatisfiedBy($datasource) { return ($datasource->get($this->field) >= $this->value); } } |
這里沒有太多的不可思議的:在構(gòu)造器里面存儲(chǔ)相應(yīng)的要被比較的字段和值,然后在方法isSatisfiedBy()里面驗(yàn)證提取出來的字段。
下面是一個(gè)測試實(shí)例,用來演示如何應(yīng)用FieldGreaterThanOrEqualSpecification。
| class SpecificationsTestCase extends UnitTestCase { // ... function TestFieldGreaterThanOrEqualSpecification() { $adult = new FieldGreaterThanOrEqualSpecification(‘age’, 18); $presidential_age = new FieldGreaterThanOrEqualSpecification(‘age’, 35); $this->assertTrue($adult->isSatisfiedBy($this->ds)); $this->assertFalse($presidential_age->isSatisfiedBy($this->ds)); } } |
你是否已經(jīng)注意到在規(guī)范對(duì)象被標(biāo)識(shí)上合理的名稱時(shí)候,這些代碼是如何開始證明自己的嗎?你是否能夠通過規(guī)范對(duì)象的名稱來理解到代碼的相應(yīng)的功能? $adult->isSatisfiedBy($something)你看一眼就會(huì)明白,根本無需深入詳細(xì)的鉆研代碼。這也是規(guī)范模式的優(yōu)點(diǎn)之一吧。
分享:《PHP設(shè)計(jì)模式介紹》第八章 迭代器模式類中的面向?qū)ο缶幊谭庋b應(yīng)用邏輯。類,就是實(shí)例化的對(duì)象,每個(gè)單獨(dú)的對(duì)象都有一個(gè)特定的身份和狀態(tài)。單獨(dú)的對(duì)象是一種組織代碼的有用方法,但通常你會(huì)處理一組對(duì)象或者集合。 屬性來自 SQL 查
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-《PHP設(shè)計(jì)模式介紹》第十章 規(guī)范模式(3)
。