国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

解析php中反射的應(yīng)用

2024-05-04 23:10:01
字體:
供稿:網(wǎng)友
一 反射的使用:

復(fù)制代碼 代碼如下:


<?php
class Person{
public $name;
function __construct($name){
$this->name=$name;
}
}
interface Module{
function execute();
}
class FtpModule implements Module{
function setHost($host){
print "FtpModule::setHost():$host/n";
}
function setUser($user){
print "FtpModule::setUser():$user/n";
}
function execute(){
//something
}
}
class PersonModule implements Module{
function setPerson(Person $person){
print "PersonModule::setPerson:{$person->name}/n";
}
function execute(){
//something
}
}
class ModuleRunner{
private $configData
=array(
"PersonModule"=>array('person'=>'bob'),
"FtpModule"=>array('host'=>'example.com','user'=>'anon')
);
private $modules=array();
function init(){
$interface=new ReflectionClass('Module');
foreach($this->configData as $modulename=>$params){
$module_class=new ReflectionClass($modulename);//根據(jù)配置configData的名稱,實例化ReflectionClass
if(!$module_class->isSubclassOf($interface)){//檢查反射得到了類是否是$interface的子類
throw new Exception("unknown module type:$modulename");//不是Module子類則拋出異常
}
$module=$module_class->newInstance();//實例化一個FtpModule或者PersonModule對象
foreach($module_class->getMethods() as $method){//獲得類中的方法
$this->handleMethod($module,$method,$params);
}
array_push($this->modules,$module);//將實例化的module對象放入$modules數(shù)組中
}
}
function handleMethod(Module $module,ReflectionMethod $method,$params){
$name=$method->getName();//獲得方法名稱
$args=$method->getParameters();//獲得方法中的參數(shù)
if(count($args)!=1||substr($name,0,3)!="set"){//檢查方法必須是以set開頭,且只有一個參數(shù)
return false;
}
$property=strtolower(substr($name,3));//講方法名去掉set三個字母,作為參數(shù)
if(!isset($params[$property])){//如果$params數(shù)組不包含某個屬性,就返回false
return false;
}
$arg_class=@$args[0]->getClass;//檢查setter方法的第一個參數(shù)(且唯一)的數(shù)據(jù)類型
if(empty($arg_class)){
$method->invoke($module,$params[$property]);
}else{
$method->invoke($module,$arg_class->newInstance($params[$property]));
}
}
}
$test=new ModuleRunner();
$test->init();
?>


二 通過反射獲得類中信息:

復(fù)制代碼 代碼如下:


<PRE class=php><?php
class ReflectionUtil{
static function getClassSource(ReflectionClass $class){
$path=$class->getFileName();
$lines=@file($path);
$from=$class->getStartLine();
$to=$class->getEndLine();
$len=$to-$from+1;
return implode(array_slice($lines,$from-1,$len));
}
}
$classname="Person";
$path="../practice/{$classname}.php";
if(!file_exists($path)){
throw new Exception("No such file as {$path}");
}
require_once($path);
if(!class_exists($classname)){
throw new Exception("No such class as {$classname}");
}
print ReflectionUtil::getClassSource(new ReflectionClass('Person'));
?>
</PRE><BR>
<PRE></PRE>
結(jié)果是:class Person{ public $age; public $name; function getName(){return "zjx";} function getAge(){return 12;} function __toString(){ $rs=$this->getName(); $rs.="(age".$this->getAge().")"; return $rs; } }
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 长春市| 河西区| 克东县| 大英县| 延吉市| 云霄县| 准格尔旗| 阳原县| 即墨市| 鹰潭市| 定远县| 侯马市| 将乐县| 西安市| 汝南县| 韩城市| 鹤岗市| 乳山市| 阳山县| 岐山县| 德江县| 盐池县| 台安县| 广昌县| 沁水县| 中宁县| 漳浦县| 米脂县| 小金县| 建德市| 新源县| 青州市| 黑水县| 文成县| 大新县| 龙里县| 宜昌市| 泰和县| 南城县| 宁夏| 水富县|