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 클래스에 대한 다음 정보를 얻을 수 있습니다.
정적 속성 정적 속성$class = new ReflectionClass('Person');
$properties = $class->getProperties(); foreach($properties as $property) { echo $property->getName()."\n"; } // 输出: // _allowDynamicAttributes // id // name // biography
$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);사용 가능한 매개변수 목록:
ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
Reflection 재산: : IS_PROTECTED
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!