Factory.php 1.3 KB

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