PHP反射类详解

PHP的反射机制允许开发者在运行时获取类、方法和属性的信息。通过ReflectionClass可以获取类名、属性和方法,以及执行方法。反射常用于调试、动态代理等高级功能,但应谨慎使用以避免性能影响。示例展示了如何使用反射创建类实例、调用方法和获取参数。
摘要由CSDN通过智能技术生成

什么是php反射类,可以理解为一个类的映射

PHP的反射机制使开发者能够在运行时获取类、方法和属性的信息,并且可以在不知道这些类、方法和属性名称的情况下与它们交互。

以下是使用PHP反射实现相关功能的示例:

1. 获取类的名称:

$class = new \ReflectionClass('MyClass');
echo $class->getName();

2. 获取类的属性和属性值:

$class = new \ReflectionClass('MyClass');
$properties = $class->getProperties();
foreach ($properties as $property) {
    $name = $property->getName();
    $value = $property->getValue(new MyClass());
    echo "$name: $value\n";
}

3. 获取类的方法和参数:


 

$class = new \ReflectionClass('MyClass');
$methods = $class->getMethods();
foreach ($methods as $method) {
    $name = $method->getName();
    $parameters = $method->getParameters();
    echo "$name(";
    foreach ($parameters as $parameter) {
        $paramName = $parameter->getName();
        echo "$paramName, ";
    }
    echo ")\n";
}

PHP反射机制可以用于调试和实现一些高级功能,但是应该谨慎使用它,因为它可能会导致代码的复杂性和性能问题。

举个例子

class fuc {   //定义一个类
    static function ec(){
        echo "我是一个类";
    }
}

$class = new ReflectionClass('fuc'); //建立fuc这个类的反射类
echo $class; //输出这个反射类
Class [ class A ] { @@  F:\phpweb\myPHP\test.php 23-30 - Constants [0] { } - Static properties [0] { } -  Static methods [0] { } - Properties [0] { } - Methods [1] { Method [ public method __construct ] { @@ F:\phpweb\myPHP\test.php 26 - 29 } }  }
$fuc = $class->newInstance();  //相当于实例化fuc类
$fuc->ec(); //执行fuc里的方法ec

/*最后输出:我是一个类*/

其中还有一些更高级的用法

$ec=$class->getmethod('ec'); //获取fuc类中的ec方法
$fuc = $class->new Instance(); //实例化
$ec->invoke($fuc);   //执行ec方法

上面的过程很熟悉吧,其实和调用对象的方法类似

只不过这里是反着来的,方法在前,对象在后

举例

[php]

try{
//如果存在控制器名字的类
if(class_exists($this->getController())) {
        //利用反射api构造一个控制器类对应的反射类

$rc = new ReflectionClass($this->getController());
//如果该类实现了IController接口

if($rc->implementsInterface('Icontroller')) {
//该类拥有解析后的action字符串所指向的方法名

if($rc->hasMethod($this->getAction())) {
            
//构造一个控制器的示例

$controller = $rc->newInstance();

//获取该类$action参数所指向的方法对象    

$method = $rc->getMethod($this->getAction());  

//反射类方法对象的调用方式:    

$method->invoke($controller);  

} else {  

//以下为可能抛出异常    

throw new Exception("Action");  
}  
} else {  
    throw new Exception("Interface");  
}  
} else {  
    throw new Exception("Controller");  
}  

    }catch(exception $e)  
    {  
        echo $e;  
                }
            }

        }



}

要是还不懂,再举个例子

class Foo {
public $foo = 1;
protected $bar = 2;
private $baz = 3;
/**
* Enter description here ...
*/

public function myMethod()
{
    echo "hello 2b";
    }
}

$ref = new ReflectionClass('Foo');
$props = $ref->getProperties();
foreach ($props as $value) {
    echo $value->getName()."\n";

}

ReflectionClass 这个类返回时某个类的相关信息,比如 属性,方法,命名空间,实现那些接口等!上个例子中ReflectionClass::getProperties返回是ReflectionProperty对象的数组

ReflectionProperty 类报告了类的属性的相关信息。比如 isDefault isPrivate isProtected isPublic isStatic等,方法getName 是获取属性的名称!

以上是获取属性的,还有获取类方法的

比如:

class Foo {
public $foo = 1;
public  $bar = 2;
public $baz = 3;

/**
* Enter description here ...
*/
public function myMethod()
{
    echo "hello world";
    }
}

$ref =  new ReflectionClass('Foo');
$method = $ref->getMethod('myMethod');
$method->invoke($ref->newInstance());

ReflectionClass::getMethod 是反一个ReflectionMethod类型,ReflectionMethod类报告了一个方法的有关信息,比如isAbstract isPrivate isProtected isPublic isStatic isConstructor,还有一个重要的方法Invoke,InvokeArgs 就是执行方法!

其他的对象可以看看手册,不是很难!

那反射究竟有那些用途?

反射是一个动态运行的概念,综合使用他妈可用来帮助我们分析其他类,接口,方法,属性和扩展,还可构建模式,比如动态代理,在一些php框架中使用反射也是很经常,比如kohana,yii,下面是kohana的实现mvc的代码,就是用到了反射!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值