php鏈式呼叫
轉自默默 http://bbs.phpchina.com/thread-237323-1-1.html
寫程式的人都喜歡偷懶,希望少打幾行程式碼,並且讓程式碼看起來很酷。
所以很多人寫程式都會選擇三元運算取代if..else…。
而用過JS的人應該都見識過js中的鏈式方法。
如 somevars.func().func2().func3()…funcN();
這樣的寫法使得程式碼更簡練,並且作用關係一目瞭然。
那麼在php中可以這麼做麼,顯然也是可以的,但是php與js的差別是,在js中變數本身具有物件的性質,但是php的變數卻不是。
所以解決方法就是讓php的變數變成一個物件。
程式碼如下:
<?php error_reporting(E_ALL | E_STRICT); /** * PHP-OOP_VAR 讓php的變數變成一個物件 * * * @version 0.0.1 * @author momodev * @website http://momodev.blog.51cto.com * @license GPL v3 - http://vork.us/go/mvz5 */ Abstract Class Base_OOP_VAR{ /** * 追溯資料,用來進行除錯 * @var array */ private $_trace_data = array(); /** * 儲存可用的方法列表 * @var array */ protected $_methods = array( ); /** * 資料本身 * @var null */ protected $data; /** * 初始化變數 * @param var * @return void */ public function __construct($data){ $this->data = $data; $this->_trace_data[`__construct`] = $data; return $this->data; } /** * 魔術方法,當試圖對物件進行列印如 echo 或print的時候,呼叫這個方法 * * 比如: * $a = new stdClass; * echo $a; * 等價於 echo $a->__toString(); * * @return $data */ public function __toString(){ if(is_int($this->data) || is_float($this->data)) $this->data = (string)$this->data; return $this->data; } /** * 魔術方法,當試圖呼叫一個不存在的方法時,這個函式會接管這個請求 * * 比如 * $a= new stdClass; * $a->output(); * 等價於 * $a->__call("output"); * * @return object */ public function __call($name,$args){ $this->vaild_func($name); if(!$args) $args = $this->data; $this->data = call_user_func($name,$args); $this->_trace_data[$name] = $this->data; return $this; } /** * 檢查方法是否是有效的 * @params string $name * @return void */ private function vaild_func($name){ if(!in_array($name,$this->_methods)){ throw new Exception("invaild method"); } } /** * 對資料進行追溯 * 比如 * $a = new String(" Hello World"); * $a->trim()->strlen(); * 在呼叫trim的時候,實際上把前後的空格給去掉了,所以資料是 * Hello World * 在呼叫strlen的時候 * 得到了一個字串長度的值 * 追溯資料方便檢查在哪個環節資料出現了問題 * * @return string */ public function trace(){ echo "<pre>"; var_dump($this->_trace_data); echo "</pre>"; } } /** * ex. 怎麼來使用這個抽象類 * * 宣告一個字串物件 * class String extends Base_OOP_VAR{ * //新增可用的方法 * protected $_methods = array( * `trim`, * `strlen`, * `gettype` * ); * * } * //使用這個物件 * $a = new String(" Hello world"); * echo $a->trim()->strlen()->gettype(); * $a->trace(); * //除錯的資料類似這樣 * array(4) { * //初始化時的資料 * ["__construct"]=> string(12) " Hello world" * //去除前後空格的資料 * ["trim"]=> string(11) "Hello world" * //代表字串長度的資料 * ["strlen"]=> int(11) * //代表字串型別的資料 * ["gettype"]=> string(7) "integer" * } * * * * **/
相關文章
- 如何在PHP中實現鏈式方法呼叫PHP
- 如何在PHP中實現鏈式方法呼叫薦PHP
- jQuery鏈式呼叫thisjQuery
- js 鏈式呼叫JS
- 技術卡片 - PHP 鏈式呼叫的簡單實現PHP
- jQuery的鏈式呼叫jQuery
- Objective C 鏈式呼叫Object
- php用curl封裝一個http請求類(鏈式呼叫)PHP封裝HTTP
- JavaScript中的鏈式呼叫JavaScript
- Promise 原始碼:then 鏈式呼叫Promise原始碼
- Swift可選鏈式呼叫Swift
- PHP 建立鏈式物件PHP物件
- jQuery鏈式呼叫例項分析jQuery
- Android總結之鏈式呼叫(方法鏈)Android
- php鏈式操作實現四則鏈式運算PHP
- 分散式服務呼叫鏈追蹤分散式
- javascript鏈式呼叫簡單介紹JavaScript
- 分散式系統呼叫鏈監控分散式
- CoffeeScript攻略2.5:鏈式呼叫物件物件
- php 獲取函式被呼叫位置PHP函式
- 分散式系統中的分散式鏈路追蹤與分散式呼叫鏈路分散式
- 像跟蹤分散式服務呼叫那樣跟蹤 Go 函式呼叫鏈分散式Go函式
- PHP列印呼叫函式入口地址(堆疊),方便調式PHP函式
- 呼叫鏈系列(2):輕呼叫鏈實現
- 鏈式呼叫 | 我的程式碼沒有else
- 用Promise實現小程式介面鏈式呼叫Promise
- js 實現鏈式呼叫名稱空間JS
- jQuery鏈式呼叫簡單例項程式碼jQuery單例
- javascript實現鏈式呼叫簡單介紹JavaScript
- PHP-stacktrace: PHP 程式外檢視函式呼叫堆疊PHP函式
- PHP 三種方式實現鏈式操作PHP
- GO 的鏈式呼叫寫一個轉碼庫Go
- 呼叫鏈系列四:呼叫鏈上下文傳遞
- JS-非同步函式鏈式呼叫2(精簡版,推薦)JS非同步函式
- php的鏈式操作的理解和應用PHP
- 呼叫鏈與日誌關聯的探索式查詢
- [10] 名稱空間擴充套件和鏈式呼叫套件
- Sentinel 原理-呼叫鏈