PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。
很多方法并不能完全窥探到类的内部,get_class_vars方法和get_object_vars方法,都是只能看到公共的属性,get_class_methods也只能看到公有的方法。
ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE
如果要同时获取public 和private 属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED
请注意部分内部 API 丢失了反射扩展工作所需的代码。 例如,一个内置的 PHP 类可能丢失了反射属性的数据。这些少数的情况被认为是错误,不过, 正因为如此,它们应该被发现和修复。
举个栗子吧,我有个Person类
/**
* Class Person
* php反射获取类相关信息
* @author lightWay
* @version 1.2
* @since 1.0
*/
class Person {
protected $gender; //性别
private $age; //年龄
public $name; //姓名
static $num; //统计多少人
const HOME = 'china'; //家乡
/**
* Person constructor.
* @param $name string 姓名
* @param $age integer 年龄
* @param $gender string 性别
*/
public function __construct($name,$age,$gender)
{
$this->name = $name;
$this->age = $age;
$this->gender = $gender;
self::$num++;
}
/**
* 说出自己的名字
*/
public function sayMyName()
{
echo 'my name is ',$this->name;
}
/**
* 说出自己的性别
*/
protected function sayMySex()
{
echo 'my sex is ',$this->gender;
}
/**
* 说出自己的年龄
*/
private function sayMyAge()
{
echo 'my age is ',$this->age;
}
/**
* @param $val string 需要格式化打印的数据
*/
public static function pp($val)
{
echo "<pre>";
var_dump($val);
}
}
传统的方式,想窥探类的内部怎么做呢,get_class系列函数
$person = new Person('lightWay','24','male');
//常规的做法
Person::pp(get_class($person)); //根据对象名返回类名
Person::pp(get_class_methods('Person')); //根据类名返回类的方法名组成的数组
Person::pp(get_class_vars('Person')); //根据类名返回类的默认属性组成的数组,公有属性
Person::pp(get_object_vars($person)); //根据对象名回有对象属性组成的关联数组,公有属性
var_dump($person); //直接var_dump()方式打印对象
很多方法并不能完全窥探到类的内部,get_class_vars方法和get_object_vars方法,都是只能看到公共的属性,get_class_methods也只能看到公有的方法。
尝试下用php的放射机制看看:
//反射做法
$reflection = new ReflectionClass('Person');
$properties = $reflection->getProperties(); //获取所有类属性
$methods = $reflection->getMethods(); //获取所有的方法
$constants = $reflection->getConstants(); //获取所有的常量信息
//获取类注释
print_r($reflection->getDocComment());
//输出所有方法的注释
foreach ($methods as $i)
{
Person::pp($i->getDocComment());
}
//打印所有成员属性
foreach ($properties as $v)
{
echo $v->getName(),'<br />';
}
//打印所有方法名称
foreach ($methods as $v)
{
echo $v->getName(),'<br />';
}
默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:
//只要私有的属性
Person::pp($reflection->getProperties(ReflectionProperty::IS_PRIVATE));
可用参数列表:
ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE
如果要同时获取public 和private 属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED
不过这样也是很麻烦的,如果我是想看整个类的内部呢,有没有一个可以直接打印一个类,让人一目了然,当然有,
//输出整个类结构
echo "<pre>";
Reflection::export($reflection);
比var_dump强太多了吧!