<?php
//php反射库函数的实践
//php反射函数的使用
/**
* Class Student
*/
Class Student
{
private $name;
private $age;
private $idno;
const ROLE_NAME = 'student';
/**
* Student constructor.
* @param $name comment:姓名 type:string
* @param $age comment:年龄 type:int
* @param $idno comment:学号 type:string
*/
function __construct($name, $age, $idno){
$this->name = $name;
$this->age = $age;
$this->idno = $idno;
}
public function showInfo(){
echo "idno:".$this->idno."<br>";
echo "age:".$this->age."<br>";
echo "name:".$this->name."<br>";
}
}
echo "<h3>----------- ReflectionObject实例化 -----------</h3>";
$obj = new ReflectionObject(new Student("ZhaiCoder", 30, "20190876"));
echo '<pre>$obj = new ReflectionObject(new Student("ZhaiCoder", 30, "20190876")); //实例化反射类<br>var_dump($obj->getName()); //获取类名</pre>';
var_dump($obj->getName());
var_dump($obj->getDocComment());
var_dump($obj->getFileName());
var_dump($obj->getEndLine());
echo "<h3>----------- 构造方法/函数 -----------</h3>";
echo '<pre>var_dump($obj->getConstructor()); //获取构造函数</pre>';
var_dump($obj->getConstructor());
echo "<h3>----------- const常量 -----------</h3>";
echo '<pre>var_dump($obj->getConstants()); //获取类中所有常量</pre>';
var_dump($obj->getConstants());
echo '<pre>var_dump($obj->getConstant("ROLE_NAME")); //获取类中指定常量的值</pre>';
var_dump($obj->getConstant("ROLE_NAME"));
echo '<pre>var_dump($obj->hasConstant("ROLE_NAME")); //判断是否包含常量<br>var_dump($obj->hasConstant("PREFIX"));</pre>';
var_dump($obj->hasConstant("ROLE_NAME"));
var_dump($obj->hasConstant("PREFIX"));
echo "<h3>----------- 属性 -----------</h3>";
echo '<pre>var_dump($obj->getProperties()); //获取类中所有属性</pre>';
var_dump($obj->getProperties());
echo '<pre>var_dump($obj->getProperty("age")); //获取类中指定属性的值</pre>';
var_dump($obj->getProperty("age"));
echo '<pre>var_dump($obj->hasProperty("age")); //判断类是否包含指定属性<br>var_dump($obj->hasProperty("sex"));</pre>';
var_dump($obj->hasProperty("age"));
var_dump($obj->hasProperty("sex"));
echo "<h3>----------- 方法(注意构造函数与大小写) -----------</h3>";
echo '<pre>var_dump($obj->getMethods()); //获取类中所有方法</pre>';
var_dump($obj->getMethods());
echo '<pre>var_dump($obj->getMethod("__construct")); //获取类中指定方法</pre>';
var_dump($obj->getMethod("__construct"));
echo '<pre>var_dump($obj->hasMethod("construct")); //检验名称不完全匹配是否影响</pre>';
var_dump($obj->hasMethod("construct"));
echo '<pre>var_dump($obj->hasMethod("__construct")); </pre>';
var_dump($obj->hasMethod("__construct"));
echo '<pre>var_dump($obj->hasMethod("showinfo")); //检验大小写是否影响</pre>';
var_dump($obj->hasMethod("showinfo"));
//经时间得知,大小写不影响
echo '<pre>$str = $obj->getMethod("__construct")->getDocComment(); //获取方法的注释内容 <br></br>var_dump($str);</pre>';
$str = $obj->getMethod('__construct')->getDocComment();
var_dump($str);
echo "<h3>----------- 方法权限相关(public/protected/private等) -----------</h3>";
var_dump($obj->getMethod('__construct')->isConstructor());
var_dump($obj->getMethod('__construct')->isPrivate());
var_dump($obj->getMethod('__construct')->isProtected());
//由此可检验方法默认权限属性是public
var_dump($obj->getMethod('__construct')->isPublic());
var_dump($obj->getMethod('__construct')->getDeclaringClass());
var_dump($obj->getMethod('__construct')->getModifiers());
var_dump($obj->getMethod('__construct')->export($obj->getName(), '__construct'));