>  기사  >  백엔드 개발  >  PHP 반사 반사 메커니즘 예제에 대한 자세한 설명

PHP 반사 반사 메커니즘 예제에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2017-07-01 10:44:411458검색

PHP5에는 반사라는 새로운 기능이 추가되었습니다. 이 기능을 통해 프로그래머는

리버스 엔지니어링[리버스 엔지니어링] 클래스, 인터페이스, 함수, 메서드 및 확장[확장 라이브러리 지원]을 수행할 수 있습니다.

PHP 코드를 통해 객체의 모든 정보를 얻고 상호 작용할 수 있습니다.

다음 Person 클래스를 가정합니다.

class Person {
    /**
     * For the sake of demonstration, we"re setting this private
     */
    private $_allowDynamicAttributes = false;
    
    /**
     * type=primary_autoincrement
     */
    protected $id = 0;
    
    /**
     * type=varchar length=255 null
     */
    protected $name;
    
    /**
     * type=text null
     */
    protected $biography;
    public function getId() {
        return $this->id;
    }
    public function setId($v) {
        $this->id = $v;
    }
    public function getName() {
        return $this->name;
    }
    public function setName($v) {
        $this->name = $v;
    }
    public function getBiography() {
        return $this->biography;
    }
    public function setBiography($v) {
        $this->biography = $v;
    }
}

ReflectionClass를 통해 Person 클래스에 대한 다음 정보를 얻을 수 있습니다.

정적 속성 정적 속성
  • Namespace
  • Namespace

  • Person 클래스가 final인지 abstract인지 여부

  • 클래스 이름 "Person"을 ReflectionClass:

     $class = new ReflectionClass('Person');
  • 에 전달하세요. * 속성(Properties) 가져오기:
  • $properties = $class->getProperties();
    foreach($properties as $property) {
        echo $property->getName()."\n";
    }
    // 输出:
    // _allowDynamicAttributes
    // id
    // name
    // biography
  • 기본적으로 ReflectionClass는 개인 속성과 보호 속성을 포함한 모든 속성을 가져옵니다. 비공개 속성만 가져오려면 추가 매개변수를 전달해야 합니다.
  •  $private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);
사용 가능한 매개변수 목록:

ReflectionProperty::IS_STATIC


ReflectionProperty::IS_PUBLIC

Reflection 재산: : IS_PROTECTED

ReflectionProperty::IS_PRIVATE
  • 공용 속성과 개인 속성을 모두 얻으려면 다음과 같이 작성하세요. ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED
  • $property를 통해 속성 이름을 얻을 수 있습니다. ->getName(), getDocComment를 전달하면 속성에 작성된 주석을 가져올 수 있습니다.

  • foreach($properties as $property) {
        if($property->isProtected()) {
            $docblock = $property->getDocComment();
            preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);
            echo $matches[1]."\n";
        }
    }
    // Output:
    // primary_autoincrement
    // varchar
    // text

    좀 놀랍습니다. 댓글을 받을 수도 있습니다.

  • * 메소드 가져오기

    : getMethods()를 통해 클래스의 모든 메소드를 가져옵니다. 반환되는 것은 ReflectionMethod 개체의

    배열
  • 입니다.

더 이상 시연이 없습니다.

* 마지막으로 ReflectionMethod를 통해 클래스의 메서드를 호출합니다.


$data = array("id" => 1, "name" => "Chris", "biography" => "I am am a PHP developer");
foreach($data as $key => $value) {
    if(!$class->hasProperty($key)) {
        throw new Exception($key." is not a valid property");
    }
 
    if(!$class->hasMethod("get".ucfirst($key))) {
        throw new Exception($key." is missing a getter");
    }
 
    if(!$class->hasMethod("set".ucfirst($key))) {
        throw new Exception($key." is missing a setter");
    }
 
    // Make a new object to interact with
    $object = new Person();
 
    // Get the getter method and invoke it with the value in our data array
    $setter = $class->getMethod("set".ucfirst($key));
    $ok = $setter->invoke($object, $value);
 
    // Get the setter method and invoke it
    $setter = $class->getMethod("get".ucfirst($key));
    $objValue = $setter->invoke($object);
 
    // Now compare
    if($value == $objValue) {
        echo "Getter or Setter has modified the data.\n";
    } else {
        echo "Getter and Setter does not modify the data.\n";
   }
}

위 내용은 PHP 반사 반사 메커니즘 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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