phpでのリフレクションの応用例
リリース: 2016-07-25 08:58:31
-
- /**
- * php リフレクションの例
- * bbs.it-home.org を編集する
- */
- class person{
- public $name;
- function __construct($name){
- $this->name=$name;
- }
- }
- インターフェース Module{
- functionexecute();
- }
- class FtpModule 実装 Module{
- function 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("不明なモジュール タイプ:$modulename");//不是モジュール子类则抛出异常
- }
- $module=$module_class->newInstance();//实例化一个FtpModuleまたはパーソンモジュールオブジェクト
- 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; //セッター メソッドの最初のパラメータ(そして唯一)のデータ型
- if(empty($arg_class)){
- $method->invoke($module,$params[$property]);
- }else{
- $method->invoke($module,$arg_class->newInstance($params[$property]));
- }
- }
- }
- $test=new ModuleRunner();
- $test->init( );
- ?>
复制代码
二、通过反射获取类的信息:
-
- /**
- * クラス情報を取得するための php リフレクション
- * bbs.it-home.org を編集する
- */
- 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="人";
- $path="../practice/{$classname}.php";
- if(!file_exists( $path)){
- throw new Exception("{$path} のようなファイルはありません");
- }
- require_once($path);
- if(!class_exists($classname)){
- throw new Exception("そのようなファイルはありませんclass as {$classname}");
- }
- print ReflectionUtil::getClassSource(new ReflectionClass('person'));
- ?>
复制代码
输出结果:
クラス 人{ public $age;パブリック $name;関数 getName(){return "zjx";} 関数 getAge(){return 12;} 関数 __toString(){ $rs=$this->getName(); $rs.="(年齢".$this->getAge().")"; $rs を返します。 } } |
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
-
2024-10-22 09:46:29
-
2024-10-13 13:53:41
-
2024-10-12 12:15:51
-
2024-10-11 22:47:31
-
2024-10-11 19:36:51
-
2024-10-11 15:50:41
-
2024-10-11 15:07:41
-
2024-10-11 14:21:21
-
2024-10-11 12:59:11
-
2024-10-11 12:17:31