什么是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的代码,就是用到了反射!