分享,好像不一定都是正面的,也可以提供一些負面的例子,也算是一種貢獻!!
(鐵人賽不到十天,就已經快要乾枯了....真的很弱,我)
學習分享,除了分享新奇、正確且優良的知識技術外
好像也可以分享一些 非正確 的例子,也是另一種成長與學習
最近看 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 處理結果
那....就宣告一個 陣列屬性值來存放吧!!
嗯!!....分享"非正確"的例子,應該也是一種學習與成長吧!!
這個叫做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就已經是成熟的方案了。
哈~~真的很高興 fillano 的指導說明!!~真的學到很多!!
嗯~之前也稍為使用過 ORM
就是 fillano 提到的 chaining 使用方式!!