使用反射机制完成权限控制下指定目录下所有控制器方法的自动检索(原创)

2018-09-06 08:19:43   php分享记录

 

直接上代码

  1. private function getControllers($type = 1){
  2. $file = opendir(__DIR__);
  3. $controllers = array();
  4. if($file){
  5. while(($f1 = readdir($file)) !== false){
  6. if($f1 != "." && $f1 != ".." && !is_dir($f1)){
  7. $controller_names = basename($f1,'.php');
  8. if($type == 2){
  9. $temp_array = $this->getMethods($controller_names);
  10. $controllers[$controller_names] = $temp_array;
  11. }else{
  12. $temp_array = $controller_names;
  13. $controllers[] = $temp_array;
  14. }
  15. }
  16. }
  17. }
  18. closedir($file);
  19. return $controllers;
  20. }
  21. /**
  22. * 使用反射机制映射出对应类的方法名 去除继承的方法以及私有方法
  23. * @param $controller
  24. * @return array
  25. */
  26. private function getMethods($controller)
  27. {
  28. $controller = __NAMESPACE__.DIRECTORY_SEPARATOR.$controller;
  29. $method = array();
  30. $class = new \ReflectionObject(new $controller());
  31. //获取父类的方法
  32. foreach ($class->getParentClass()->getMethods() as $v){
  33. if(!$v->isPrivate()) $method[] = $v->getName();
  34. }
  35. $true_methods = array();
  36. //去除继承的方法
  37. foreach ($class->getMethods() as $v){
  38. if(!$v->isPrivate()) {
  39. if(!in_array($v->getName(),$method)){
  40. $true_methods[] = $v->getName();
  41. }
  42. }
  43. }
  44. return $true_methods;
  45. }