> 백엔드 개발 > PHP 튜토리얼 > PHP의 반사 메커니즘을 소개하는 예 반사 메커니즘_php 예

PHP의 반사 메커니즘을 소개하는 예 반사 메커니즘_php 예

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-05-16 20:38:50
원래의
937명이 탐색했습니다.

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을 수정하지 않습니다.";
}
}

재밌네요.

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿