单例

单例模式确保类在全局只能有一个实例,因为它的实例是由自己保存,在类的外部也无法对该类进行实例化。

作用

PHP的单例模式是为了避免重复创建对象带来的资源消耗。

用途

实际项目中像数据库查询,日志输出,全局回调,统一校验等模块。这些模块功能单一,但需要多次访问,如果能够全局唯一,多次复用会大大提升性能。

例子

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: yf
  5. * Date: 2018/5/24
  6. * Time: 下午4:17
  7. */
  8. namespace EasySwoole\Component;
  9. class Di
  10. {
  11. use Singleton;
  12. private $container = array();
  13. public function set($key, $obj,...$arg):void
  14. {
  15. /*
  16. * 注入的时候不做任何的类型检测与转换
  17. * 由于编程人员为问题,该注入资源并不一定会被用到
  18. */
  19. $this->container[$key] = array(
  20. "obj"=>$obj,
  21. "params"=>$arg,
  22. );
  23. }
  24. function delete($key):void
  25. {
  26. unset( $this->container[$key]);
  27. }
  28. function clear():void
  29. {
  30. $this->container = array();
  31. }
  32. /**
  33. * @param $key
  34. * @return null
  35. * @throws \Throwable
  36. */
  37. function get($key)
  38. {
  39. if(isset($this->container[$key])){
  40. $obj = $this->container[$key]['obj'];
  41. $params = $this->container[$key]['params'];
  42. if(is_object($obj) || is_callable($obj)){
  43. return $obj;
  44. }else if(is_string($obj) && class_exists($obj)){
  45. try{
  46. $this->container[$key]['obj'] = new $obj(...$params);
  47. return $this->container[$key]['obj'];
  48. }catch (\Throwable $throwable){
  49. throw $throwable;
  50. }
  51. }else{
  52. return $obj;
  53. }
  54. }else{
  55. return null;
  56. }
  57. }
  58. }

Di容器设置全局回调。

核心对象方法

核心类:EasySwoole\Component\Singleton。

获取对象

  • mixed $args 参数

static function getInstance(…$args)