이 글은 주로예제 소개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 클래스가 최종인지 추상인지
코드는 다음과 같습니다.
$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 ReflectionProperty::IS_PROTECTED ReflectionProperty::IS_PRIVATE
이상하게 느껴지지 않을 것입니다.
코드는 다음과 같습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!