ホームページ  >  記事  >  バックエンド開発  >  php_PHP チュートリアルでのリフレクションのアプリケーションを分析する

php_PHP チュートリアルでのリフレクションのアプリケーションを分析する

WBOY
WBOYオリジナル
2016-07-21 15:05:04752ブラウズ

一反射一反射的:



复制代码

代码代码:


<?php
classperson {
public $ name; name=$name;
}
}
インターフェースモジュール{
関数execute();
}
クラスFtpModule実装モジュール{
関数setHost($host){
print "FtpModule::setHost():$hostn";
}
function setUser($user){
print "FtpModule::setUser():$usern";
}
functionexecute(){
//something
}
}
class PersonModuleimplements Module{
function setperson(person $person){
print "personModule::setperson:{$person->name}n";
}
functionexecute(){
//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);//構成configData の名前に基づいて、ReflectionClass を例化
if(!$module_class->isSubclassOf($interface)){//检查反射得了了クラスかどうか $interface的子クラス
throw new Exception("unknown module type:$modulename");//不是モジュール子クラス则抛出异常
}
$module=$module_class->newInstance();//实例化一个FtpModuleまたは者PersonModule对象
foreach($module_class->getMethods() as $method){//获得类中のメソッド
$this->handleMethod($module,$method,$params);
}
array_push($this ->modules,$module);// 例化したモジュールオブジェクトを $modules 数グループ中に放り込む
}
}
function handleMethod(Module $module,ReflectionMethod $method,$params){
$name=$method- >getName();//メソッド名を取得します
$args=$method->getParameters();//メソッド内のパラメータを取得します
if(count($args)!=1||substr($name,0 ,3)!="set"){///查メソッドは set である必要があり、パラメータが 1 つだけあります
return false;
}
$property=strto lower(substr($name,3));//讲メソッド名去掉set三字母,パラメータとして
if(!isset($params[$property])){//如果$params数组不包含特定のプロパティ,就返false
return false;
}
$arg_class=@$ args[0]->getClass;//查setter メソッドの最初のパラメータ(そして唯一)のデータ型
if(empty($arg_class)){
$method->invoke($module,$params[ $property]);
}else{
$method->invoke($module,$arg_class->newInstance($params[$property]));
}
}
}
$test=new ModuleRunner() ;
$test->init();?>
二 通过反射获得类中信息:
🎜复制码🎜🎜代码如下:🎜

<?php<BR>class ReflectionUtil{<BR> static function getClassSource(ReflectionClass $class){<BR> $path=$class->getFileName();<br> $lines= @file($path);<br> $from=$class->getStartLine();<br> $to=$class->getEndLine();<br> $len=$to-$from+1;<br> return implode(array_slice ($lines,$from-1,$len));<br> }<br>}<br>$classname="人";<br>$path="../practice/{$classname}.php";<br>if(!file_exists( $path)){<br> throw new Exception("{$path} のようなファイルはありません");<br>}<br>require_once($path);<br>if(!class_exists($classname)){<br> throw new Exception("そのようなファイルはありませんclass as {$classname}");<br>}<br>print ReflectionUtil::getClassSource(new ReflectionClass('person'));<br>?><br>


</PRE&gt ;<BR>結果是:class person{ public $age;パブリック $name;関数 getName(){return "zjx";} 関数 getAge(){return 12;} 関数 __toString(){ $rs=$this->getName(); $rs.="(年齢".$this->getAge().")"; $rs を返します。 } }<br><pre class="brush:php;toolbar:false">gt;

gt;

gt;

gt;


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327710.html技術記事一つの反射の使用法: 复制代码 代码如下: ?php class Person{ public $name; function __construct($name){ $this-name=$name;インターフェースモジュール{関数実行(); } クラス...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。