PHP対象チェーン操作実現原理分析

3048 ワード

本明細書の例では、PHPオブジェクトチェーン動作の実現原理について説明する.皆さんの参考にしてください.具体的には以下の通りです.
チェーン操作とは何ですか?jQueryを使っている同級生は印象的だと思います.jQueryではDOM要素を操作することがよくあります.

$("p").css("color").addClass("selected");


一貫した操作は確かにクールに見え、コードの読み取りも便利です.ではPHPで実現できるのでしょうか?答えは肯定的で、もちろんOOPで使わなければならないが、プロセス化されたプログラムでは、このような方法を使う必要はない.
PHPでは、多くの関数を使用します.

$str = 'abs123 ';
echo strlen(trim($str));


上のコードの役割は、文字列の両側のスペースを除去し、その長さを出力することです.チェーンプログラミングを使用すると、次のようになります.

$str = 'abs123 ';
echo $str->trim()->strlen();


見ているともっと気持ちがいいのではないでしょうか.ここでは主にPHPを利用してオブジェクトの奥に向かっています_call()と_toString()マジックメソッド

/**
*        
*    2015-04-24
*/
class BaseChainObject{
    /**
*     ,      
* @var array
*/
private $_trace_data = array();
    /**
    *            
    *    @param array
    */
    protected $_methods = array();
    /**
    *         
    *    @param null
    */
    public $data;
    function __construct($data){
        $this->data = $data;
        $this->_trace_data['__construct'] = $data;
        return $this->data;
    }
    function __toString(){
        return (String)$this->data;
    }
    function __call($name,$args){
        try{
            $this->vaild_func($name);
        }catch(Exception $e){
            echo $e->getMessage();
            exit();
        }
        if (!$args) {
            $args = $this->data;
            $this->data = call_user_func($name,$args);
        }else{
            $this->data = call_user_func_array($name,$args);
        }
        $this->_trace_data[$name] = $this->data;
        return $this;
    }
    /**
    *            
    *    @param string
    */
    private function vaild_func($fn){
        if(!in_array($fn, $this->_methods)){
            throw new Exception("unvaild method");
        }
    }
    public function trace(){
      var_dump($this->_trace_data);
    }
}
class String extends BaseChainObject{
    protected $_methods = array('trim','strlen');
}
$str = new String('ab rewqc ');
echo $str->trim()->strlen();
$str->trace();


以上のコードから分かるように、呼び出しオブジェクトに存在しないメソッドが自動的にトリガーされます_call()マジックメソッド、そしてcall_user_func()はチェーン操作を実行する、オブジェクトを出力するときにtoString()をトリガして所望の結果を出力する.もちろんもう一つの案は、カスタマイズの方法でreturn thisを使うことで、オブジェクトチェーン式の操作も実現できるので、自分でやってみてください.
PHPについてもっと兴味のある読者は、「phpオブジェクト向けプログラミング入門教程」、「PHP基本文法入門教程」、「PHP演算と演算子用法総括」、「PHPネットワークプログラミング技巧総括」、「PHP配列(Array)操作技巧大全」、「php文字列(string)用法総括」、「php+mysqlデータベース操作入門チュートリアル」および「php一般データベース操作テクニック要約」
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.