• 单例
    • 作用
    • 用途
    • 例子
    • 核心对象方法

    单例

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

    作用

    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)