PHP中的__toString方法(實現JS里的鏈式操作)


_toString方法是在打印對象時自動調用的魔術方法,如果不聲明會報以下錯

Catchable fatal error: Object of class String could not be converted to 

示例:

PHP里有很多的字符串函數,假如要先過濾字符首尾的空格,再求出字符串的長度,一般會這么寫:
strlen(trim($str));
如果要實現JS里的鏈式操作,比如像下面這樣,應該怎么實現?
$str->trim()->strlen()
很簡單,先實現一個String類,對這個類的對象調用方法進行處理時,觸發__call魔術方法,接着執行call_user_func或者call_user_func_array即可.
以下是簡單的實現
<?php
class String
{
    public $value;//字符串的值
    public function __construct($str)
    {
        $this->value = $str;
    }
    public function __call($method, $args)
    {
        array_push($args,$this->value);
        $this->value = call_user_func_array($method,$args);
        return $this;
    }
    //打印對象時返回對象的value值
    public function __toString()
    {
        return  strval($this->value);
    }
}
$str = new String('20150816');
echo $str->trim()->strtotime()->date('Y年m月d日');

運行結果如下

2015年08月16日

PHP的__toString魔術方法的設計原型來源於Java,Java中也有這么一個方法,而且在Java中,這個方法被大量使用,對於調試程序比較方便. 實際上,__toString方法也是一種序列化, PHP自帶的serialize/unserialize也是進行序列化的, 但是這組函數序列化時會產生一些無用信息,如屬性字符串長度,造成存儲空間無謂浪費.因此,可以實現自己的序列化和反序列化方法,或者json_encode/json_decode也是一個不錯的選擇


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM