iT邦幫忙

DAY 11
7

網頁開發五四三系列 第 12

分享最近看到的一種 php 程式寫法方法 ....

php
  • 分享至 

  • twitterImage
  •  

分享,好像不一定都是正面的,也可以提供一些負面的例子,也算是一種貢獻!!
(鐵人賽不到十天,就已經快要乾枯了....真的很弱,我)

學習分享,除了分享新奇、正確且優良的知識技術外

好像也可以分享一些 非正確 的例子,也是另一種成長與學習

最近看 code , 看到一個很"新"的寫作方式(對我來說,沒看過,就是"新")

因為平常在寫 JavaScript 會有以下這種寫作方式

// jQuery v1.5 後新增的 Deferred 
$.ajax({ options })
.done(function( msg ) { doSomething.... });
.done(function( msg ) { doSomething 2.... });
.fail();
.always();

利用 deferred object 去做一些處理,就可以一直給它"點"下去....

那麼,在 php 也可以在一個處理流程,一直點它 "→(指)" 下去嗎?

好像是可以的!!虛擬碼如下:

class MyClass
{
	var rtnResult ;

	function func1()
	{
		//	doSomeThing....		
		return $this ;
	}

	function func2()
	{
		//	doSomeThing....		
		return $this ;
	}

	function func3()
	{
		//	doSomeThing....		
		return $this ;
	}
	
	function func4()
	{
		//	doSomeThing....		
		return $this ;
	}
	
	function end()
	{
		//	doSomeThing....		
		return $this->rtnResult ;
	}
	
	
}

$obj = new MyClass();
$res = $obj
       ->func1()
       ->func2()
       ->func3()
       ->func4()
       ->end();

因為在 func1 ~ func4 都是 return $this

所以,就可以繼續給它呼叫該 object 的 method

呼叫完所有 func ,直到最後,回應處理結果!!

你可能會問說~

那如果處理到一半,就有結果,不必再繼續下去,怎麼停呢?

嗯!!~~我在文章一開始就有說~

分享一些"非正確"的例子,也是一種學習成長嘛!!

別人走過失敗的路,也是一種經驗累積囉!!

或許,真的有些流程,是真的要跑完全部...

記錄所有 Error 或每個 function 處理結果

那....就宣告一個 陣列屬性值來存放吧!!

嗯!!....分享"非正確"的例子,應該也是一種學習與成長吧!!


上一篇
取得 IP , 針對 Raspberry Pi 於家中利用 pppoeconf 連線
系列文
網頁開發五四三12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
0
fillano
iT邦超人 1 級 ‧ 2013-09-26 15:01:58

這個叫做chaining或是fluent interface...

其實用的很多,因為透過這樣的方法,可以讓物件方法的操作方式類似DSL(例如SQL),容易入手。php有很多DB相關的library就是這樣設計的,例如:
* Zend Framework裡面的Zend\Db\Sql\Sql
* CodeIgniter的ActiveRecord類別
* c9s做的SQLBuilder
* FluentPDO ORM
等等...

在使用或設計時,應該要把方法分成至少兩種,例如賦與條件與取得結果。這樣就可以明確區分而不致於chain到自己混淆。以CI的ActiveRecord為例,你在使用過select()->from()->where()之後,一定是用get()等方法來取得結果。

我以前有想到做簡單的SQL Builder類別,不過這是我孤陋寡聞,而且我沒有做chaining。從回覆就可以看到,當時Zend_Db_Select(現在的Zend\Db\Sql)或是Propel就已經是成熟的方案了。

shazi iT邦新手 4 級 ‧ 2013-09-26 16:09:11 檢舉

哈~~真的很高興 fillano 的指導說明!!~真的學到很多!!

嗯~之前也稍為使用過 ORM
就是 fillano 提到的 chaining 使用方式!!

我要留言

立即登入留言