ReflectionClass: public static string export() //打印类的详细信息 public string getName() //取得类名或接口名 public bool isInternal() //类是否为系统内部类 public bool isUserDefined() //类是否为用户自定义类 public bool isInstantiable() //类是否被实例化过 public bool hasMethod(string name) //类是否有特定的方法 public bool hasProperty(string name)//类是否有特定的属性 public string getFileName() //获取定义该类的文件名,包括路径名 public int getStartLine() //获取定义该类的开始行 public int getEndLine() //获取定义该类的结束行 public string getDocComment() //获取该类的注释 public ReflectionMethod getConstructor() //取得该类的构造函数信息 public ReflectionMethod getMethod(string name) //取得该类的某个特定的方法信息 public ReflectionMethod[] getMethods() //取得该类的所有的方法信息 public ReflectionProperty getProperty(string name) //取得某个特定的属性信息 public ReflectionProperty[] getProperties() //取得该类的所有属性信息 public array getConstants() //取得该类所有常量信息 public mixed getConstant(string name) //取得该类特定常量信息 public ReflectionClass[] getInterfaces() //取得接口类信息 public bool isInterface() //测试该类是否为接口 public bool isAbstract() //测试该类是否为抽象类
-----------------------------------------------------------------------
class X{
public static function go(){
echo '<h1>go</h1>';
}
public function gogo(){
echo '<h1>gogo</h1>';
}
}
class Y extends X {
}
//==============================================================================
$y = new Y();
// 取得 static
$className = get_parent_class($y);
$ref = new ReflectionMethod($className, 'go');
$ref->invoke(NULL);
//==============================================================================
function make($class, $vars = array()) {
$ref = new ReflectionClass($class);
if(!$ref->isInstantiable()) {
throw new Exception("类{$class} 不存在");
}
// 取得建構式
$constructor = $ref->getConstructor();
if(is_null($constructor)) {
return new $class;
}
// 確定建構式的參數
$params = $constructor->getParameters();
$resolveParams = array();
foreach ($params as $key=>$value) {
$name = $value->getName();
if(isset($vars[$name])) {
$resolveParams[] = $vars[$name];
} else {
// 參數是否有默認值
$default = $value->isDefaultValueAvailable() ? $value->getDefaultValue() : null;
if(is_null($default)) {
// 參數沒有默認值
if($value->getClass()) {
// 遞迴(這點似乎有點多)
$resolveParams[] = make($value->getClass()->getName(), $vars);
} else {
throw new Exception("{$name} 没有传值且没有默认值。");
}
} else {
$resolveParams[] = $default;
}
}
}
return $ref->newInstanceArgs($resolveParams);
}