PHP 可連接多個 "->" 來連續處理、執行 的 物件寫法

物件(Object) 在撰寫時, 會希望 於使用、操作上, 可以更直覺化(擴充性... 等等, 不是此篇重點.), 下述的寫法就很常見.

  • $db->select('*')->limit(10)->begin(0) ... 等等. (在操作上(Method), 可以一直 "->" 的操作下去.)
  • 執行順序:
    1. select('*')
    2. limit(10)
    3. begin(0)

但是一般物件(Class)教學的寫法, 都只能 $db->select('*') 就結束了, 要再串接多個 ->, 就會直接出現錯誤訊息.

PHP Class - 標準物件的寫法

範例1


<?php
class Test
{
    protected $str;

    public function __construct()
    {
    }

    public function a()
    {
        $this->str .= 'a';
    }

    public function b()
    {
        $this->str .= 'b';
    }

    public function display()
    {
        return $this->str . "\n";
    }
}

/* 測試 */
$a = new Test();
$a->a(); // a
$a->b(); // b
// $a->a()->b(); // error
echo $a->display(); // ab
?>

PHP Class - 串接多個 "->" 的寫法

要串接多個 "->", 只要在 Function (Method) 的 回傳值(return value), 回傳 $this (物件本身) 即可. (將物件本身回傳, 即可繼續操作下去.)

範例2


<?php
class Test
{
    protected $str;

    public function __construct()
    {
    }

    public function a()
    {
        $this->str .= 'a';

        return $this;
    }

    public function b()
    {
        $this->str .= 'b';

        return $this;
    }

    public function display()
    {
        return $this->str . "\n";
    }
}

/* 測試 */

$a = new Test();
$a->a(); // a
$a->b(); // ab => a + b
$a->a()->b(); // abab => ab + a + b
echo $a->display(); // abab
?>

範例說明

  • 範例1 的值就是每個執行完, 都是單獨的程序
  • 範例2 的值, 會一直不斷的被累加起來(註: 字串一直接起來).
  • 註: 其它程式語言也是相同作法.

關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 My_Note-Programming。將永久鏈結加入書籤。

PHP 可連接多個 "->" 來連續處理、執行 的 物件寫法 有 4 則回應

  1. jaceju 說道:

    很久以前我也寫過一篇類似的文喔~ http://www.jaceju.net/blog/?p=81
    後來才知道它叫做 Fluent Interface (http://www.martinfowler.com/bliki/FluentInterface.html)

  2. Tsung 說道:

    嗯嗯, 我在想說這種寫法蠻普遍的, 但是不知道叫什麼名詞~ 感恩~~~ Orz..

  3. evoup 說道:

    返回对象就可以啦,->就是对象操作符啦。

  4. Tsung 說道:

    Yes, 就是 return object. 🙂

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料