>  기사  >  백엔드 개발  >  PHP 고급 기능 - 자세한 반영 예시

PHP 고급 기능 - 자세한 반영 예시

伊谢尔伦
伊谢尔伦원래의
2017-07-01 10:47:401383검색

1. 성찰이란 무엇인가요?

PHP 실행 상태에서 PHP 프로그램 분석을 확장하고 주석을 포함하여 클래스, 메소드, 속성, 매개변수 등에 대한 자세한 정보를 내보내거나 추출하는 것을 의미합니다. 이렇게 동적으로 정보를 얻고 객체의 메소드를 동적으로 호출하는 기능을 리플렉션 API라고 합니다.
Reflection은 객체 지향 패러다임 메타모델을 조작하기 위한 API로, 매우 강력하며 복잡하고 확장 가능한 애플리케이션을 구축하는 데 도움이 될 수 있습니다.

2. 리플렉션의 용도는 다음과 같습니다:

자동 로딩

플러그인, 자동 문서 생성, PHP 언어 확장에도 사용할 수 있습니다. 3. Reflection의 구체적인 응용 사례 - CI 프레임워크의 구현 예를 예로 들어보겠습니다.

Reflection 기능이 매우 강력한데 어떻게 구체적으로 사용하나요? 적용 시나리오는 무엇입니까? CI 프레임워크의 CI_Upload 클래스를 예로 들어 설명하겠습니다. (ReflectionClass에 대한 전역 검색 후 여기서만 리플렉션이 유용하다는 것을 알았습니다.)

이 메서드의 핵심 논리는 CI_Upload를 인스턴스화할 때 호출자가 $config 배열을 전달하고 배열의 모든 구성이 해당 배열에 할당된다는 것입니다. 클래스 멤버 속성(속성에 해당하는 set_* 메소드가 있는 경우 set_* 메소드 호출)

방법 1. 리플렉션 없이 작성 방법:

public function initialize(array $config = array(), $reset = TRUE){
    $reflection = new ReflectionClass($this);
...    #遍历config,如果存在set_方法调用set方法,没有则直接赋值
    foreach ($config as $key => $v) {        if (method_exists($this, 'set_' . $key)) {            $this->{'set_' . $key}($v);
        }else{            $this->$key =$v;
        }
    }
...

이 방법에는 단점이 있습니다.

클래스 멤버의 모든 키가 config 배열은 합법적입니다. 클래스의 멤버 속성인지 여부는

리플렉션을 사용하여 판단할 수 있습니다. 여기서 리플렉션의 이점은 클래스에 속성이 있는지 여부를 결정할 수 있다는 것입니다(
).
hasProperty),和判断类是否存在方法(hasMethod방법 2. CI 프레임워크 내에서 구현

D:\project\app\system\libraries\Upload.php/**
 * Initialize preferences
 *
 * @param   array   $config
 * @param   bool    $reset
 * @return  CI_Upload
 */public function initialize(array $config = array(), $reset = TRUE){
    $reflection = new ReflectionClass($this);
...    foreach ($config as $key => &$value)
    {        if ($key[0] !== '_' && $reflection->hasProperty($key))
        {            if ($reflection->hasMethod('set_'.$key))
            {                $this->{'set_'.$key}($value);
            }            else
            {                $this->$key = $value;
            }
        }
    }
...

4. 요약

리플렉션에 대해(리플렉션 클래스(ReflectionClass)이든 리플렉션 함수인 ReflectionFunction이든 실제로는 클래스와 함수의 차이입니다)만 기억하세요. 한 가지: 리플렉션 클래스/함수 다음을 포함하여 클래스에 대한 모든 정보를 얻을 수 있습니다.

-클래스의 기본 정보(클래스 이름,

추상 클래스
인지 여부, 인스턴스화 가능 여부, 클래스가 최종인지 또는 클래스인지 여부) abstract) - 클래스의 메소드, 메소드 존재 여부, 메소드 반환 값, 메소드 주석, 메소드 이름 - 클래스 속성, 정적 속성, 상수
- 위치
네임스페이스
네임스페이스 위와 같은 상황이신 분들을 위해, 리플렉션을 사용하여 문제를 해결할 수도 있습니다 :)

위 내용은 PHP 고급 기능 - 자세한 반영 예시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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