Instance.php 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. namespace Qii\Autoloader;
  3. /**
  4. * Instance类
  5. * @author Jinhui Zhu<jinhui.zhu@live.cn>2015-10-22 19:45
  6. * @version 1.3
  7. *
  8. * 使用方法:
  9. *
  10. * $class = Qii\Instance::init('className');
  11. * 再次使用就可以直接通过Qii\Instance::getInstance('className');
  12. */
  13. class Instance
  14. {
  15. const VERSION = '1.2';
  16. /**
  17. * @var APP_LOAD_PREFIX 保存类到以APP_LOAD_PREFIX开头的key中
  18. */
  19. const APP_LOAD_PREFIX = '__qii_instance';
  20. /**
  21. * @var $loadedClass 保存加载过的类
  22. */
  23. protected static $loadedClass = array();
  24. /**
  25. * 获取初始化的类
  26. * @param string $className 类名
  27. * @reutrn object
  28. */
  29. public static function getInstance($className)
  30. {
  31. if (isset(self::$loadedClass[self::APP_LOAD_PREFIX . $className])) return self::$loadedClass[self::APP_LOAD_PREFIX . $className];
  32. throw new \Qii\Exceptions\CallUndefinedClass(\Qii::i('1105', $className), __LINE__);
  33. }
  34. /**
  35. * 初始化类保存到_loadedClass中并返回
  36. */
  37. public static function initialize()
  38. {
  39. $args = func_get_args();
  40. $className = array_shift($args);
  41. if (!class_exists($className, false)) throw new \Qii\Exceptions\CallUndefinedClass(\Qii::i('1105', $className), __LINE__);
  42. if (isset(self::$loadedClass[self::APP_LOAD_PREFIX . $className])
  43. && self::$loadedClass[self::APP_LOAD_PREFIX . $className]
  44. ) return self::$loadedClass[self::APP_LOAD_PREFIX . $className];
  45. $loader = new \ReflectionClass($className);
  46. try {
  47. $instance = $loader->newInstanceArgs($args);
  48. self::$loadedClass[self::APP_LOAD_PREFIX . $className] = $instance;
  49. //如果有_initialize方法就自动调用_initialize方法,并将参数传递给_initialize方法
  50. if ($loader->hasMethod('_initialize')) {
  51. call_user_func_array(array($instance, '_initialize'), $args);
  52. }
  53. return self::$loadedClass[self::APP_LOAD_PREFIX . $className];
  54. } catch (\Exception $e) {
  55. throw new \Exception($e->getMessage(), __LINE__);
  56. }
  57. }
  58. /**
  59. * 加载文件后再初始化
  60. */
  61. public static function instance()
  62. {
  63. $args = func_get_args();
  64. $className = array_shift($args);
  65. \Qii\Autoloader\Psr4::getInstance()->loadFileByClass($className);
  66. return call_user_func_array(array('\Qii\Autoloader\Instance', 'initialize'), array_merge(array($className), $args));
  67. }
  68. }