Factory.php 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <?php
  2. namespace Qii\Autoloader;
  3. class Factory
  4. {
  5. /**
  6. * @param array $_instance 实例化对象的存储池
  7. */
  8. protected static $instance = [];
  9. /**
  10. * 以 new \Qii\Autoloader\Factory($className)的方式实例化对象
  11. */
  12. public function __construct($className)
  13. {
  14. return Factory::getInstance($className);
  15. }
  16. /**
  17. * 实例化对象
  18. * @param string $className 类名
  19. */
  20. public static function getInstance($className)
  21. {
  22. if(!$className)
  23. {
  24. return \Qii::e('CLASS_NAME_IS_NULL', $className);
  25. }
  26. if(isset(Factory::$instance[$className]) &&
  27. Factory::$instance[$className] != null
  28. ){
  29. return Factory::$instance[$className];
  30. }
  31. $args = func_get_args();
  32. array_shift($args);
  33. if(!class_exists($className, false))
  34. {
  35. $className = Psr4::getInstance()->getClassName($className);
  36. }
  37. $refClass = new \ReflectionClass($className);
  38. $instance = $refClass->newInstanceArgs($args);
  39. if ($refClass->hasMethod('_initialize')) {
  40. call_user_func_array(array($instance, '_initialize'), $args);
  41. }
  42. return Factory::$instance[$className] = $instance;
  43. }
  44. }