<?php
namespace app;
error_reporting(E_ALL);
ini_set('display_errors','on');
/**
@description 测试反射类
@author jackson.hu
@date 2022.06.15
@flag 187
*/
class MyReflection
{
public $prefix = 'GS';
public static $instance = 0;
const COMPANY = '广厦';
public static function getInstance()
{
if (self::$instance){
self::$instance = new self();
}
return self::$instance;
}
/**
@description 打招呼的方法
@param string name 用户名
@return string
@flag 187
*/
public function say($name)
{
echo '['.$this->prefix.'] '.self::COMPANY.' say hello world to you~~'.$name;
return $name;
}
}
// 1.输出类信息
echo '========================== 输出类信息 ======================================='.PHP_EOL;
\ReflectionClass::export(MyReflection::class);
$reflectionClass = new \ReflectionClass(MyReflection::class);
// 2.获取类名(含命名空间)
echo PHP_EOL.'========================== 获取类名(含命名空间) ======================================='.PHP_EOL;
var_dump($reflectionClass->getName());
// 3.获取类命名空间(不含类名)
echo PHP_EOL.'========================== 获取类命名空间(不含类名) ======================================='.PHP_EOL;
var_dump($reflectionClass->getNamespaceName());
// 4.获取类文档
echo PHP_EOL.'========================== 获取类文档 ======================================='.PHP_EOL;
var_dump($reflectionClass->getDocComment());
// 4.1获取某个文档属性的值
echo PHP_EOL.'========================== 获取某个文档属性的值 ======================================='.PHP_EOL;
function getDocAttribute($doc,$attr)
{
$res = preg_match("/@{$attr}\s(.*)/m",$doc,$matches);
if ($res) {
return trim($matches[1]);
} else {
return '';
}
}
echo getDocAttribute($reflectionClass->getDocComment(),'flag').PHP_EOL;
echo getDocAttribute($reflectionClass->getDocComment(),'description').PHP_EOL;
echo getDocAttribute($reflectionClass->getDocComment(),'date').PHP_EOL;
echo getDocAttribute($reflectionClass->getDocComment(),'author').PHP_EOL;
// 5.获取类属性
// 5.1获取类属性(经测试包含普通属性和静态属性)
echo PHP_EOL.'========================== 获取类属性 ======================================='.PHP_EOL;
$properties = $reflectionClass->getProperties();
foreach($properties as $property){
echo $property->getName().PHP_EOL;
}
// 5.2获取类常量属性
echo PHP_EOL.'========================== 获取类常量属性 ======================================='.PHP_EOL;
$const = $reflectionClass->getConstants();
var_dump($const);
foreach($const as $name => $val){
echo $name.'---------'.$val.PHP_EOL;
}
// 5.3获取类静态属性
echo PHP_EOL.'========================== 获取类静态属性 ======================================='.PHP_EOL;
$properties = $reflectionClass->getStaticProperties();
var_dump($properties);
foreach($properties as $name => $val){
echo $name.'---------'.$val.PHP_EOL;
}
// 5.4获取类属性修饰符
echo PHP_EOL.'========================== 获取类属性修饰符 ======================================='.PHP_EOL;
$properties = $reflectionClass->getProperties();
foreach($properties as $property){
var_dump($property->getModifiers()).PHP_EOL;
var_dump(\Reflection::getModifierNames($property->getModifiers())).PHP_EOL;
}
// 5.5类属性的几个判断访问权限的方法
echo PHP_EOL.'========================== 获取类属性修饰符 ======================================='.PHP_EOL;
$properties = $reflectionClass->getProperties();
foreach($properties as $property){
echo 'is_public:'.$property->isPublic().PHP_EOL;
echo 'is_protected:'.$property->isProtected().PHP_EOL;
echo 'is_private:'.$property->isPrivate().PHP_EOL;
echo 'is_static:'.$property->isStatic().PHP_EOL;
}
// 6.获取类方法文档
echo PHP_EOL.'========================== 获取类方法文档 ======================================='.PHP_EOL;
// 7.获取类方法
// 7.1获取类方法(经测试包含普通方法和静态方法)
echo PHP_EOL.'========================== 获取类方法 ======================================='.PHP_EOL;
$methods = $reflectionClass->getMethods();
foreach($methods as $method){
echo $method->getName().PHP_EOL;
}
// 7.2获取类静态方法集合的方法
// 7.3没有获取类方法参数(php7+版本,8版本通过getAttributes,暂不做讨论)
// 7.4获取类方法修饰符
echo PHP_EOL.'========================== 获取类方法修饰符 ======================================='.PHP_EOL;
$methods = $reflectionClass->getMethods();
foreach($methods as $method){
var_dump($method->getModifiers()).PHP_EOL;
var_dump(\Reflection::getModifierNames($method->getModifiers())).PHP_EOL;
}
// 7.5方法的几个判断访问权限的方法
echo PHP_EOL.'========================== 方法的几个判断访问权限的方法 ======================================='.PHP_EOL;
$methods = $reflectionClass->getMethods();
foreach($methods as $method){
echo 'is_public:'.$method->isPublic().PHP_EOL;
echo 'is_protected:'.$method->isProtected().PHP_EOL;
echo 'is_private:'.$method->isPrivate().PHP_EOL;
echo 'is_final:'.$method->isFinal().PHP_EOL;
echo 'is_abstract:'.$method->isAbstract().PHP_EOL;
echo 'is_static:'.$method->isStatic().PHP_EOL;
}
// 8.通过反射调用类方法
$method = $reflectionClass->getMethod('say');
// 散列传参
$method->invoke(new MyReflection,'123123213213213');
// 数组传参
$method->invokeArgs(new MyReflection,['123123213213213']);
结果:
========================== 输出类信息 =======================================
Deprecated: Function ReflectionClass::export() is deprecated in D:\project\test\Reflection.php on line 44
/**
@description 测试反射类
@author jackson.hu
@date 2022.06.15
@flag 187
*/
Class [ <user> class app\MyReflection ] {
@@ D:\project\test\Reflection.php 13-40
- Constants [1] {
Constant [ public string COMPANY ] { 广厦 }
}
- Static properties [1] {
Property [ public static $instance ]
}
- Static methods [1] {
Method [ <user> static public method getInstance ] {
@@ D:\project\test\Reflection.php 19 - 27
}
}
- Properties [1] {
Property [ <default> public $prefix ]
}
- Methods [1] {
/**
@description 打招呼的方法
@param string name 用户名
@return string
@flag 187
*/
Method [ <user> public method say ] {
@@ D:\project\test\Reflection.php 35 - 39
- Parameters [1] {
Parameter #0 [ <required> $name ]
}
}
}
}
========================== 获取类名(含命名空间) =======================================
string(16) "app\MyReflection"
========================== 获取类命名空间(不含类名) =======================================
string(3) "app"
========================== 获取类文档 =======================================
string(87) "/**
@description 测试反射类
@author jackson.hu
@date 2022.06.15
@flag 187
*/"
========================== 获取某个文档属性的值 =======================================
187
测试反射类
2022.06.15
jackson.hu
========================== 获取类属性 =======================================
prefix
instance
========================== 获取类常量属性 =======================================
array(1) {
["COMPANY"]=>
string(6) "广厦"
}
COMPANY---------广厦
========================== 获取类静态属性 =======================================
array(1) {
["instance"]=>
int(0)
}
instance---------0
========================== 获取类属性修饰符 =======================================
int(1)
array(1) {
[0]=>
string(6) "public"
}
int(17)
array(2) {
[0]=>
string(6) "public"
[1]=>
string(6) "static"
}
========================== 获取类属性修饰符 =======================================
is_public:1
is_protected:
is_private:
is_static:
is_public:1
is_protected:
is_private:
is_static:1
========================== 获取类方法文档 =======================================
========================== 获取类方法 =======================================
getInstance
say
========================== 获取类方法修饰符 =======================================
int(17)
array(2) {
[0]=>
string(6) "public"
[1]=>
string(6) "static"
}
int(1)
array(1) {
[0]=>
string(6) "public"
}
========================== 方法的几个判断访问权限的方法 =======================================
is_public:1
is_protected:
is_private:
is_final:
is_abstract:
is_static:1
is_public:1
is_protected:
is_private:
is_final:
is_abstract:
is_static:
[GS] 广厦 say hello world to you~~123123213213213[GS] 广厦 say hello world to you~~123123213213213