_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也是一個不錯的選擇