PHP5에는 반사라는 새로운 기능이 추가되었습니다. 이 기능을 사용하면 프로그래머는 클래스, 인터페이스, 함수, 메서드 및 확장을 리버스 엔지니어링할 수 있습니다. PHP 코드를 통해 객체의 모든 정보를 얻고 상호 작용할 수 있습니다.
Person 클래스가 있다고 가정합니다:
클래스 사람 {
/**
* 시연을 위해 비공개로 설정하고 있습니다
*/
비공개 $_allowDynamicAttributes = false;
/**유형=primary_autoincrement*/
보호된 $id = 0;
/**유형=varchar 길이=255 null*/
보호된 $name;
/**유형=텍스트 null*/
보호되는 $biography;
공개 함수 getId()
{
$this->id 반환
}
공개 함수 setId($v)
{
$this->id = $v;
}
공개 함수 getName()
{
$this->name;
반환
}
공개 함수 setName($v)
{
$this->name = $v;
}
공개 함수 getBiography()
{
$this->biography 반환
}
공개 함수 setBiography($v)
{
$this->biography = $v;
}
}
ReflectionClass를 통해 Person 클래스에 대한 다음 정보를 얻을 수 있습니다.
1.상수 상수
2. 속성 속성 이름
3. 메소드 메소드 이름
4. 정적 속성
5. 네임스페이스 네임스페이스
6.Person 클래스가 final인지 abstract인지
클래스 이름 "Person"을 ReflectionClass에 전달하세요.
$class = new ReflectionClass('Person');
속성 가져오기(Properties):
$properties = $class->getProperties();
foreach($properties를 $property로) {
echo $property->getName()."n";
}
// 출력:
// _allowDynamicAttributes
//아이디
// 이름
// 자기소개
기본적으로 ReflectionClass는 개인 속성과 보호 속성을 포함한 모든 속성을 가져옵니다. 비공개 속성만 가져오려면 추가 매개변수를 전달해야 합니다.
$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);
사용 가능한 매개변수 목록:
반사속성::IS_STATIC
반사속성::IS_PUBLIC
반사속성::IS_PROTECTED
반사속성::IS_PRIVATE
공용 속성과 개인 속성을 모두 가져오려면 다음과 같이 작성하세요. ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED
이상하게 느껴져서는 안 됩니다.
속성 이름은 $property->getName()을 통해 얻을 수 있고, 속성에 작성된 댓글은 getDocComment를 통해 얻을 수 있습니다.
foreach($properties를 $property로) {
If($property->isProtected()) {
$docblock = $property->getDocComment();
Preg_match('/ type=([a-z_]*) /', $property->getDocComment(), $matches);
echo $matches[1]."n";
}
}
// 출력:
// 기본_자동증가
//varchar
// 텍스트
좀 놀랍네요. 댓글을 받을 수도 있습니다.
메소드 가져오기: getMethods()를 통해 클래스의 모든 메소드를 가져옵니다. 반환되는 것은 ReflectionMethod 객체의 배열입니다. 더 이상의 시위는 없습니다.
마지막으로 ReflectionMethod를 통해 클래스의 메서드가 호출됩니다.
$data = array("id" => 1, "name" => "Chris", "biography" => "저는 PHP 개발자입니다");
foreach($data as $key => $value) {
If(!$class->hasProperty($key)) {
새로운 예외 발생($key."는 유효한 속성이 아닙니다.");
}
If(!$class->hasMethod("get".ucfirst($key))) {
새로운 예외 발생($key."에 getter가 누락됨");
}
If(!$class->hasMethod("set".ucfirst($key))) {
새로운 예외 발생($key."에 setter가 누락됨");
}
// 상호작용할 새 객체를 만듭니다
$object = 새로운 사람();
// getter 메소드를 가져와 데이터 배열의 값으로 호출합니다
$setter = $class->getMethod("set".ucfirst($key));
$ok = $setter->invoke($object, $value);
// setter 메소드를 가져와 호출합니다
$setter = $class->getMethod("get".ucfirst($key));
$objValue = $setter->invoke($object);
// 이제 비교
If($value == $objValue) {
echo "Getter 또는 Setter가 data.n을 수정했습니다.";
} 그 밖의 {
echo "Getter 및 Setter는 data.n을 수정하지 않습니다.";
}
}
재밌네요.