phpでのリフレクションの応用例

WBOY
リリース: 2016-07-25 08:58:31
オリジナル
962 人が閲覧しました
  1. /**
  2. * php リフレクションの例
  3. * bbs.it-home.org を編集する
  4. */
  5. class person{
  6. public $name;
  7. function __construct($name){
  8. $this->name=$name;
  9. }
  10. }
  11. インターフェース Module{
  12. functionexecute();
  13. }
  14. class FtpModule 実装 Module{
  15. function setHost($host){
  16. print "FtpModule::setHost():$hostn";
  17. }
  18. function setUser($user){
  19. print "FtpModule::setUser():$usern";
  20. }
  21. functionexecute(){
  22. //something
  23. }
  24. }
  25. class PersonModuleimplements Module{
  26. function setperson(person $person){
  27. print "personModule: :setPerson:{$person->name}n";
  28. }
  29. functionexecute(){
  30. //something
  31. }
  32. }
  33. class ModuleRunner{
  34. private $configData
  35. =array(
  36. "PersonModule"=>array) ('person'=>'bob'),
  37. "FtpModule"=>array('host'=>'example.com','user'=>'anon')
  38. );
  39. private $modules =array();
  40. function init(){
  41. $interface=new ReflectionClass('Module');
  42. foreach($this->configData as $modulename=>$params){
  43. $module_class=new ReflectionClass($ modulename);//構成configDataの名前に基づいて、ReflectionClassを例化
  44. if(!$module_class->isSubclassOf($interface)){//反射結果が$interfaceであるかどうかを確認します
  45. throw new Exception("不明なモジュール タイプ:$modulename");//不是モジュール子类则抛出异常
  46. }
  47. $module=$module_class->newInstance();//实例化一个FtpModuleまたはパーソンモジュールオブジェクト
  48. foreach($module_class-> ;getMethods() as $method){// クラス内のメソッドを取得します
  49. $this->handleMethod($module,$method,$params);
  50. }
  51. array_push($this->modules,$module); // 例化したモジュールオブジェクトを $modules 数グループに挿入します
  52. }
  53. }
  54. function handleMethod(Module $module,ReflectionMethod $method,$params){
  55. $name=$method->getName();//获得メソッド名
  56. $args=$method->getParameters();//メソッド内のパラメータを取得します
  57. if(count($args)!=1||substr($name,0,3)!="set") {////查メソッドは set 头である必要があり、パラメータとして 1 つだけ
  58. return false;
  59. }
  60. $property=strto lower(substr($name,3));//讲メソッド名去掉set三文字母、パラメータとして
  61. if(!isset($params[$property])){//如果$params数组に特定のプロパティが含まれていない場合は、falseを返します
  62. return false;
  63. }
  64. $arg_class=@$args[0]->getClass; //セッター メソッドの最初のパラメータ(そして唯一)のデータ型
  65. if(empty($arg_class)){
  66. $method->invoke($module,$params[$property]);
  67. }else{
  68. $method->invoke($module,$arg_class->newInstance($params[$property]));
  69. }
  70. }
  71. }
  72. $test=new ModuleRunner();
  73. $test->init( );
  74. ?>
复制代码

二、通过反射获取类的信息:

  1. /**
  2. * クラス情報を取得するための php リフレクション
  3. * bbs.it-home.org を編集する
  4. */
  5. class ReflectionUtil{
  6. static function getClassSource(ReflectionClass $class){
  7. $path=$class->getFileName();
  8. $lines= @file($path);
  9. $from=$class->getStartLine();
  10. $to=$class->getEndLine();
  11. $len=$to-$from+1;
  12. return implode(array_slice) ($lines,$from-1,$len));
  13. }
  14. }
  15. $classname="人";
  16. $path="../practice/{$classname}.php";
  17. if(!file_exists( $path)){
  18. throw new Exception("{$path} のようなファイルはありません");
  19. }
  20. require_once($path);
  21. if(!class_exists($classname)){
  22. throw new Exception("そのようなファイルはありませんclass as {$classname}");
  23. }
  24. print ReflectionUtil::getClassSource(new ReflectionClass('person'));
  25. ?>
复制代码

输出结果:

クラス 人{ public $age;パブリック $name;関数 getName(){return "zjx";} 関数 getAge(){return 12;} 関数 __toString(){ $rs=$this->getName(); $rs.="(年齢".$this->getAge().")"; $rs を返します。 } }


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート