>  기사  >  백엔드 개발  >  반사 반사 메커니즘은 PHP에서 어떻게 구현됩니까?

반사 반사 메커니즘은 PHP에서 어떻게 구현됩니까?

伊谢尔伦
伊谢尔伦원래의
2017-07-01 11:30:171021검색

이 글은 주로예제 소개PHP의 Reflection 반사 메커니즘을 소개합니다. 이 글에서는 Reflection을 사용하여 클래스에 대한 정보를 얻을 수 있다는 관점에서 PHP의 Reflection 리플렉션 메커니즘을 소개합니다.

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 클래스의 다음 정보를 얻을 수 있습니다.
1. 상수 내용
2.
4. 정적 속성 정적 속성
5.
Namespace Namespace6.Person 클래스가 최종인지 추상인지

클래스 이름 "Person"을 ReflectionClass에 전달하세요.

코드는 다음과 같습니다.

$class = new ReflectionClass('Person');

속성 가져오기(속성):

코드는 다음과 같습니다.

$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
ReflectionProperty::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

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

Get 메서드: 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으로 문의하세요.