PHP 반사 메커니즘 사례 설명

간단 한 소개
클래스 구성원 이 private 로 정의 되 더 라 도 외부 에서 접근 할 수 있 으 며,클래스 를 만 들 지 않 아 도 클래스 의 구성원 과 방법 에 접근 할 수 있 습 니 다.
PHP 는 5.0 버 전 이후 반사 체 제 를 추 가 했 습 니 다.강력 한 반사 API 를 제공 합 니 다.PHP 실행 환경 에서 클래스,방법,속성,파라미터 와 주석 등 을 방문 하고 사용 할 수 있 습 니 다.그 기능 이 매우 강하 고 확장 이 높 은 PHP 프레임 워 크 에 자주 사용 되 며 플러그 인 을 자동 으로 불 러 오고 문 서 를 자동 으로 생 성 하 며 심지어 PHP 언어 를 확장 할 수 있 습 니 다.얘 가 PHP 라 서.ǖoop 확장 은 언어 자체 의 특성 을 가지 고 있 기 때문에 확장 이나 설정 을 추가 하지 않 아 도 사용 할 수 있 습 니 다.더 많은 내용 은공식 문서
반사 유형
PHP 반사 API 는 클래스,방법,속성,파라미터 등 을 기반 으로 반사 클래스 를 유지 하고 해당 하 는 호출 API 를 제공 합 니 다.
유형
설명 하 다.
Reflector
Reflector 는 내 보 낼 수 있 는 모든 반사 클래스 에 의 해 구현 되 는 인터페이스 입 니 다(implement)
Reflection
반사 류
ReflectionClass
관련 정 보 를 보고 하 다.
ReflectionZendExtension
Zend 확장 정보 보고
ReflectionExtension
PHP 확장 에 대한 정 보 를 보 고 했 습 니 다.
ReflectionFunction
함수 에 대한 정 보 를 보고 하 였 습 니 다.
ReflectionFunctionAbstract
Reflection Function 의 부류
ReflectionMethod
방법 에 관 한 정 보 를 보고 했다.
ReflectionObject
대상(object)에 대한 정 보 를 보고 하 였 습 니 다.
ReflectionParameter
함수 나 방법 파라미터 에 대한 정 보 를 되 찾 았 습 니 다.
ReflectionProperty
클래스 속성 에 대한 정 보 를 보 고 했 습 니 다.
방문 하 다.
만약 에 하나의 User 를 정의 했다 고 가정 하면 우 리 는 먼저 이러한 반사 류 인 스 턴 스 를 구축 한 다음 에 이 인 스 턴 스 를 바탕 으로 User 의 속성 이나 방법 을 방문 할 수 있 습 니 다.클래스 에서 정 의 된 구성원 권한 성명 이 Public 이 든 아니 든 가 져 올 수 있 습 니 다.

<?php 
namespace Extend;

use ReflectionClass;
use Exception;

/**
 *      
 * Class User
 * @package Extend
 */
class User{
    const ROLE = 'Students';
    public $username = '';
    private $password = '';

    public function __construct($username, $password)
    {
        $this->username = $username;
        $this->password = $password;
    }

    /**
     *      
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     *      
     * @param string $username
     */
    public function setUsername($username)
    {
        $this->username = $username;
    }

    /**
     *     
     * @return string
     */
    private function getPassword()
    {
        return $this->password;
    }

    /**
     *     
     * @param string $password
     */
    private function setPassowrd($password)
    {
        $this->password = $password;
    }
}

$class = new ReflectionClass('Extend\User');  //    User    ,    User     
$properties = $class->getProperties();  //   User      ,  ReflectionProperty   
$property = $class->getProperty('password'); //   User  password  ReflectionProperty
$methods = $class->getMethods();   //   User      ,  ReflectionMethod  
$method = $class->getMethod('getUsername');  //   User  getUsername   ReflectionMethod
$constants = $class->getConstants();   //       ,        
$constant = $class->getConstant('ROLE');   //   ROLE  
$namespace = $class->getNamespaceName();  //         
$comment_class = $class->getDocComment();  //   User      ,          
$comment_method = $class->getMethod('getUsername')->getDocComment();  //   User  getUsername       
메모:반사 클래스 를 만 들 때 전송 하 는 클래스 이름 은 use 키 워드 를 사용 하 더 라 도 완전한 네 임 스페이스 를 포함 해 야 합 니 다.그렇지 않 으 면 유형 명 을 찾 지 못 하면 이상 을 던 질 수 있다.
상호 작용
반사 류 의 인 스 턴 스 를 만 들 면 우 리 는 반사 류 를 통 해 원래 의 방법 과 속성 을 방문 할 수 있 을 뿐만 아니 라 원래 의 인 스 턴 스 를 만 들 거나 클래스 안의 방법 을 직접 호출 할 수 있다.

$class = new ReflectionClass('Extend\User');  //    User    ,    User     
$instance = $class->newInstance('youyou', 1, '***');  //   User    

$instance->setUsername('youyou_2');  //   User      setUsername       
$value = $instance->getUsername();   //   User      getUsername       
echo $value;echo "
"; // youyou_2 $class->getProperty('username')->setValue($instance, 'youyou_3'); // ReflectionProperty username $value = $class->getProperty('username')->getValue($instance); // ReflectionProperty username echo $value;echo "
"; // youyou_3 $class->getMethod('setUsername')->invoke($instance, 'youyou_4'); // ReflectionMethod , $value = $class->getMethod('getUsername')->invoke($instance); // ReflectionMethod echo $value;echo "
"; // youyou_4 try { $property = $class->getProperty('password_1'); $property->setAccessible(true); // $property $property->setValue($instance, 'password_2'); // $value = $property->getValue($instance); // echo $value;echo "
"; // password_2 $class->getProperty('password')->setAccessible(true); // ReflectionProperty $class->getProperty('password')->setValue($instance, 'password');// , $value = $class->getProperty('password')->getValue($instance); // , $value = $instance->password; // , , private }catch(Exception $e){echo $e;}
주의 사항
  • protected 또는 private 를 직접 방문 하 는 익숙 하거나 방법 은 이상 을 던 집 니 다
  • 지 정 된 Reflection Property 또는 Reflection Method 대상 setAccessible(true)방법 을 호출 해 야 비 공유 멤버 를 방문 할 수 있 습 니 다
  • 4.567917.비공 유 구성원 의 방문 권한 을 수정 하 는 것 은 현재 반사 류 의 인 스 턴 스 에 만 작용 합 니 다
  • 정적 구성원 을 얻 는 방법 과 비정 상 구성원 이 사용 하 는 방법 이 다 르 기 때문에 주의해 야 한다
  • 4.567917.부류 의 구성원 을 얻 는 방법 은 일반적인 것 과 다르다.
    시간 이 있 으 면 반사 류 의 API 표를 정리 하고 상세 한 API 목록 은 먼저 찾 아 볼 수 있 습 니 다공식 문서
    여기 서 PHP 반사 메커니즘 사례 에 대한 설명 은 여기까지 입 니 다.더 많은 관련 PHP 반사 메커니즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기