Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse des Implementierungsprinzips der PHP-Objektkettenoperation

Analyse des Implementierungsprinzips der PHP-Objektkettenoperation

高洛峰
高洛峰Original
2016-12-20 16:07:051142Durchsuche

Das Beispiel in diesem Artikel beschreibt das Implementierungsprinzip der PHP-Objektkettenoperation. Teilen Sie es allen als Referenz mit. Die Details lauten wie folgt:

Was ist eine Kettenoperation? Schüler, die jQuery verwenden, sollten sehr beeindruckt sein. In jQuery arbeiten wir häufig mit DOM-Elementen wie folgt:

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

Der kontinuierliche Betrieb sieht wirklich cool aus und ist auch zum Lesen von Code sehr praktisch. Kann er also in PHP implementiert werden? Die Antwort lautet: Ja, natürlich muss es in OOP verwendet werden. In prozeduralen Programmen besteht keine Notwendigkeit, diese Methode zu verwenden.

In PHP verwenden wir oft viele Funktionen:

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

Die Funktion des obigen Codes besteht darin, die Leerzeichen auf beiden Seiten zu entfernen Geben Sie dann seine Länge aus, dann können Sie die Kettenprogrammierung wie folgt verwenden:

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

__call() und __toString() magische Methoden in PHP objektorientiert

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();

Wie aus dem obigen Code ersichtlich ist, wird die magische Methode __call() automatisch ausgelöst, wenn das aufrufende Objekt nicht vorhanden ist, und dann zur Ausführung mit call_user_func() kombiniert Wenn das Objekt ausgegeben wird, wird toString() ausgelöst, um das gewünschte Ergebnis auszugeben. Eine andere Lösung besteht natürlich darin, dies in der Methode zu verwenden, um Objektkettenoperationen zu erreichen.

Ich hoffe, dass dieser Artikel für alle, die sich mit PHP-Programmierung befassen, hilfreich sein wird.

Weitere Artikel zur Analyse des Implementierungsprinzips der PHP-Objektkettenoperation finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn