PHP의 리플렉션 클래스

不言
풀어 주다: 2023-03-24 21:00:02
원래의
2635명이 탐색했습니다.

이 기사에서는 특정 참조 가치가 있는 PHP의 리플렉션 클래스를 소개합니다. 이제 모든 사람과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다

PHP의 리플렉션 클래스 ReflectionClass 및 ReflectionMethod 사용 예





저자: @keenleung
이 글은 작성자의 원본입니다. 재인쇄할 경우 출처를 표시해 주세요: https://www.cnblogs.com/KeenLeung/p/6041280.html


목차

PHP5는 클래스, 인터페이스, 함수, 메소드 및 확장을 리버스 엔지니어링하는 기능을 추가하는 완전한 리플렉션 API를 갖추고 있습니다.

반성이란 무엇인가요?

PHP 실행 상태에서 PHP 프로그램 분석을 확장하고 클래스, 메소드, 속성, 매개변수 등에 대한 세부 정보를 주석을 포함하여 내보내거나 추출하는 것을 말합니다. 이렇게 동적으로 정보를 얻고 객체의 메소드를 동적으로 호출하는 기능을 리플렉션 API라고 합니다. Reflection은 객체 지향 패러다임에서 메타 모델을 조작하기 위한 API이며 매우 강력하며 복잡하고 확장 가능한 애플리케이션을 구축하는 데 도움이 될 수 있습니다.

플러그인 자동 로드, 문서 자동 생성, 심지어 PHP 언어 확장에도 사용할 수 있습니다.

PHP 리플렉션 API는 프로그램의 메타데이터에 액세스하거나 관련 주석과 상호 작용하는 데 도움이 되는 여러 클래스로 구성됩니다. 리플렉션의 도움으로 클래스에 의해 구현된 메서드를 얻고, 클래스의 인스턴스를 생성하고(새로 생성하는 것과는 다름), 메서드를 호출하고(일반 호출과도 다름), 매개변수를 전달하고, 정적 메서드를 동적으로 호출할 수 있습니다. 클래스의 메소드.
Reflection API는 일부 클래스, 예외 및 인터페이스를 포함하는 PHP의 내장 OOP 기술 확장으로, 함께 사용하면 다른 클래스, 인터페이스, 메서드, 속성, 메서드 및 확장을 분석하는 데 도움이 될 수 있습니다. 이러한 OOP 확장을 리플렉션이라고 합니다.

우리는 일반적으로 ReflectionClass 클래스와 ReflectionMethod 클래스를 사용합니다. 예를 들면 다음과 같습니다.

코드는 다음과 같습니다.


1 . ReflectionClass를 통해 다음 정보를 얻을 수 있습니다.


1. 상수

2. 속성 이름

4. 속성 정적 속성 6. 최종인가요 아니면 추상인가요? 7. Person 클래스에 특정 메서드가 있나요? 다음으로 이를 반영하려면 클래스 이름 "Person"을 ReflectionClass에 전달하세요.

代码如下:



$class = new ReflectionClass('Person'); // 建立 Person这个类的反射类  
$instance  = $class->newInstanceArgs($args); // 相当于实例化Person 类
로그인 후 복사


 

1)获取属性(Properties):

 代码如下:



PHP의 리플렉션 클래스

$properties = $class->getProperties();foreach ($properties as $property) { echo $property->getName() . "\n";
}// 输出:
// _allowDynamicAttributes
// id
// name
// biography
로그인 후 복사

PHP의 리플렉션 클래스

 

默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

代码如下:



$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);
로그인 후 복사


 

可用参数列表:

代码如下:



ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE
로그인 후 복사


 通过$property->getName()可以得到属性名。

 

2)获取注释:

通过getDocComment可以得到写给property的注释。

代码如下:



PHP의 리플렉션 클래스

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
로그인 후 복사

PHP의 리플렉션 클래스

 

3)获取类的方法

 代码如下:


getMethods()       来获取到类的所有methods。
hasMethod(string)  是否存在某个方法
getMethod(string)  获取方法
로그인 후 복사


 

 4)执行类的方法:

代码如下:



PHP의 리플렉션 클래스

->getName();  = ->getmethod('getName'); ->invoke();     = ->getmethod('setName'); ->invokeArgs(, ('snsgou.com'
로그인 후 복사

PHP의 리플렉션 클래스

 

二、通过ReflectionMethod,我们可以得到Person类的某个方法的信息:

1.是否“public”、“protected”、“private” 、“static”类型
2.方法的参数列表
3.方法的参数个数
4.反调用类的方法

代码如下:



PHP의 리플렉션 클래스

// 执行detail方法
$method = new ReflectionMethod('Person', 'test'); 

if ($method->isPublic() && !$method->isStatic()) { 
echo 'Action is right';
}echo $method->getNumberOfParameters(); // 参数个数
echo $method->getParameters(); // 参数对象数组
로그인 후 복사

PHP의 리플렉션 클래스

 

 

----->>>

相关推荐:

php中的时间函数

php中的文件操作

위 내용은 PHP의 리플렉션 클래스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!