PHP 반사 원리 와 용법 깊이 분석

4744 단어 PHP반사
이 글 의 실례 는 PHP 반사 원리 와 용법 을 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
반사 라 고 하면 실제로 두 가지 개념 을 포함한다.
  • introspection 판단 류,방법 존재 여부,부자 류 관계,호출 관계 등 을 살 펴 보고 검사 하 는 함수문서.
  • 반사 Reflection 획득 클래스 의 방법,속성,주석 등,반사 클래스문서.
  • PHP 공식 문 서 를 분명하게 썼 습 니 다.구체 적 인 응용 에 대해 말씀 드 리 겠 습 니 다.
    1.파라미터 검출
    함수 에 들 어 오 는 매개 변수 유형 이 합 법 적 인지 판단 해 야 할 때 가 있 습 니 다.
    이 때 is 사용 가능a、is_subclass_of 검 측.반사 와 결합 하여 더 많은 검 사 를 한다.
    2.동적 호출
    의존 주입 에서 흔히 볼 수 있 는 이런 용법,예 를 들 어 Laravel 5.5 중의Container.php
    
    public function build($concrete)
      {
        // If the concrete type is actually a Closure, we will just execute it and
        // hand back the results of the functions, which allows functions to be
        // used as resolvers for more fine-tuned resolution of these objects.
        if ($concrete instanceof Closure) {
          return $concrete($this, $this->getLastParameterOverride());
        }
        $reflector = new ReflectionClass($concrete);
        // If the type is not instantiable, the developer is attempting to resolve
        // an abstract type such as an Interface of Abstract Class and there is
        // no binding registered for the abstractions so we need to bail out.
        if (! $reflector->isInstantiable()) {
          return $this->notInstantiable($concrete);
        }
        $this->buildStack[] = $concrete;
        $constructor = $reflector->getConstructor();
        // If there are no constructors, that means there are no dependencies then
        // we can just resolve the instances of the objects right away, without
        // resolving any other types or dependencies out of these containers.
        if (is_null($constructor)) {
          array_pop($this->buildStack);
          return new $concrete;
        }
        $dependencies = $constructor->getParameters();
        // Once we have all the constructor's parameters we can create each of the
        // dependency instances and then use the reflection instances to make a
        // new instance of this class, injecting the created dependencies in.
        $instances = $this->resolveDependencies(
          $dependencies
        );
        array_pop($this->buildStack);
        return $reflector->newInstanceArgs($instances);
      }
    
    
    상기 코드 는 먼저 패 킷 을 닫 았 는 지 여 부 를 판단 하고,만약 그렇다면 바로 되 돌려 줍 니 다.아니면 통과new ReflectionClass($concrete);반사 류 의 인 스 턴 스 를 생 성 한 다음 에 이러한 구조 함수 와 파 라 메 터 를 가 져 와 초기 화 하 는 과정 을 진행 합 니 다.
    주의 하 다.
    반사 에서 비교적 중요 한 용법 invoke
    이 종 류 를 알 고 있 을 때 구조 ReflectionMethod 를 통 해 직접 호출 할 수 있 습 니 다.예 를 들 어:
    
    class HelloWorld {
    
      public function sayHelloTo($name) {
        return 'Hello ' . $name;
      }
    
    }
    
    $reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
    echo $reflectionMethod->invoke(new HelloWorld(), 'Mike');
    
    
    이 클래스 를 모 를 때 클래스 를 아 는 대상 은 ReflectionObject 로 ReflectionMethod 를 가 져 와 서 호출 할 수 있 습 니 다.예 를 들 어:
    
    class HelloWorld {
    
      public function sayHelloTo($name) {
        return 'Hello ' . $name;
      }
    
    }
    
    $hello = new HelloWorld();
    
    $refObj = new ReflectionObject($hello);
    $refMethod = $refObj->getMethod('sayHelloTo');
    echo $refMethod->invoke($hello,'Mike');
    
    
    호출 프로 세 스 는 일반적으로 반사 류 ReflectionClass/반사 대상 ReflectionObject 의 인 스 턴 스 를 가 져 온 다음 ReflectionMethod 를 가 져 온 후 invoke 입 니 다.
    3.주석 가 져 오기,문서 생 성
    예 를 들 어 PHPDoc.
    4.주석,증강 판 주석,일정한 규칙 에 부합
    예 를 들 어 어떤 프레임 의 길 은 바로 주 해 를 통 해 이 루어 진 것 이다.
    5.반 사 를 위해 반사 하지 마라
    PHP 는 동적 언어 로 문자열 을 통 해 클래스 나 함 수 를 직접 호출 할 수 있 습 니 다.다음 과 같 습 니 다.
    
    class HelloWorld {
      public function sayHelloTo($name) {
        return 'Hello ' . $name;
      }
    }
    $hello = 'HelloWorld';
    $helloSay = 'sayHelloTo';
    $helloIntance = new $hello;
    echo $helloIntance->$helloSay('Mike');
    
    
    그럼 왜 반사 가 필요 한 거 죠?
  • 기능 이 더 강하 다
  • 더 안전 하고 노출 되 지 않 은 내부 방법 을 직접 호출 하 는 것 을 방지 합 니 다
  • 유지 할 수 있 습 니 다.직접 문자 문자열 은 하 드 코딩
  • 입 니 다.
    더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
    본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

    좋은 웹페이지 즐겨찾기