>백엔드 개발 >PHP 튜토리얼 >PHP 객체체인 연산의 구현원리 분석

PHP 객체체인 연산의 구현원리 분석

高洛峰
高洛峰원래의
2016-12-20 16:07:051146검색

이 기사의 예에서는 PHP 객체 체인 작업의 구현 원리를 설명합니다. 참고할 수 있도록 자세한 내용은 다음과 같습니다.

체인 작업이 무엇인가요? jQuery를 사용하는 학생들은 jQuery에서 DOM 요소를 다음과 같이 조작하는 경우가 많습니다. >

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

연속동작이 정말 멋있고, 코드리딩에도 아주 편리하네요. 그럼 PHP로 구현할 수 있을까요? 대답은 '예'입니다. 물론 OOP에서는 사용해야 합니다. 절차적 프로그램에서는 이 방법을 사용할 필요가 없습니다.

PHP에서는 많은 함수를 사용하는 경우가 많습니다.

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

위 코드의 기능은 양쪽 공백을 제거하는 것입니다. 그런 다음 문자열의 길이를 출력하면 다음과 같은 체인 프로그래밍을 사용할 수 있습니다.

PHP 객체 지향
$str = 'abs123 ';
echo $str->trim()->strlen();

의 __call() 및 __toString() 매직 메서드

위 코드에서 볼 수 있듯이 호출하는 객체가 메소드가 존재하지 않으면 __call() 매직 메소드가 자동으로 실행된 후 call_user_func()와 결합하여 수행됩니다. 객체가 출력되면 toString()이 트리거되어 원하는 결과를 출력합니다. 물론, 메소드에서 return this를 사용하여 직접 시도해 볼 수도 있습니다.
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();

이 기사가 PHP 프로그래밍에 종사하는 모든 사람에게 도움이 되기를 바랍니다.

PHP 객체체인 연산 구현 원리 분석과 관련된 더 많은 글은 PHP 중국어 홈페이지를 주목해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.