이 기사의 예에서는 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 중국어 홈페이지를 주목해주세요!