PHP対象チェーン操作実現原理分析
3048 ワード
本明細書の例では、PHPオブジェクトチェーン動作の実現原理について説明する.皆さんの参考にしてください.具体的には以下の通りです.
チェーン操作とは何ですか?jQueryを使っている同級生は印象的だと思います.jQueryではDOM要素を操作することがよくあります.
一貫した操作は確かにクールに見え、コードの読み取りも便利です.ではPHPで実現できるのでしょうか?答えは肯定的で、もちろんOOPで使わなければならないが、プロセス化されたプログラムでは、このような方法を使う必要はない.
PHPでは、多くの関数を使用します.
上のコードの役割は、文字列の両側のスペースを除去し、その長さを出力することです.チェーンプログラミングを使用すると、次のようになります.
見ているともっと気持ちがいいのではないでしょうか.ここでは主にPHPを利用してオブジェクトの奥に向かっています_call()と_toString()マジックメソッド
以上のコードから分かるように、呼び出しオブジェクトに存在しないメソッドが自動的にトリガーされます_call()マジックメソッド、そしてcall_user_func()はチェーン操作を実行する、オブジェクトを出力するときにtoString()をトリガして所望の結果を出力する.もちろんもう一つの案は、カスタマイズの方法でreturn thisを使うことで、オブジェクトチェーン式の操作も実現できるので、自分でやってみてください.
PHPについてもっと兴味のある読者は、「phpオブジェクト向けプログラミング入門教程」、「PHP基本文法入門教程」、「PHP演算と演算子用法総括」、「PHPネットワークプログラミング技巧総括」、「PHP配列(Array)操作技巧大全」、「php文字列(string)用法総括」、「php+mysqlデータベース操作入門チュートリアル」および「php一般データベース操作テクニック要約」
ここで述べたことが皆さんの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プログラム設計に役立つことを願っています.