php反射类使用

<?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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值