PHP框架模型 - 单例模式代码优化

今天看了一下以前的模型代码

发现控制器中不断的在new model() 调用模型方法

这样子会不断的对模型进行实例化 , 并不断的销毁对象

比如:

控制器:

public function getList()
    {
        $list = (new GoodModel)->getListByPage(10);
        return $list;
    }

    public function getDetail($id)
    {
        $data = (new GoodModel)->getDetailById($id);
        return $data;
    }

控制器简单优化

下面是优化后的控制器:

private $goodsModel ;
    public function __construct()
    {
        $this->goodsModel = new GoodsModel();
    }

    public function getList()
    {
        $list = $this->goodsModel->getListByPage(10);
        return $list;
    }

    public function getDetail($id)
    {
        $data = $this->goodsModel->getDetailById($id);
        return $data;
    }

但是这还不是我想要的 , 也不是最好的, 而且当一个业务比较复杂,使用了多个模型 ,对后期维护也不是很方便

单例模式优化

单例模式: 单例模式是创建型模式 , 提供了一种创建对象的最佳方式 ,能够确保单个对象被创建,也就是访问唯一对象的方式,可以直接访问,无需实例化该对象

下面就是加入单利模式的优化结果

控制器

 public function getList()
    {
        $list = GoodModel::getInstance()->getListByPage(10);
        return $list;
    }

模型

<?php

namespace App\Model\Entity;

use Swoft\Db\Eloquent\Model;

class GoodModel extends Model
{
    /**
     * 实例对象
     */
    private static $instance;

    /**
     * 单例模式优化
     */
    public static function getInstance()
    {
        if (self::$instance instanceof self){
            # 如果实例已经创建了
            return self::$instance;
        }
        self::$instance = new self();
        return self::$instance;
    }

    #禁用初始化函数和克隆函数, 禁止new 实例化和clone 实例化
    private function __construct(){

    }

    public function __clone()
    {

    }

    public function getListByPage($page)
    {
        return "diaknbifakbi"; // 随便写用来测试的
    }
}

但是这里有一个问题 , 就是大量的模型都复制这么大一段代码 , 还是不可以的 , 需要进一步优化

final

对这段单例模式进行抽离成一个父类 , 所有的子类去继承这个父类

这里的优化存在一个php基础 , 但是不太常用的知识

知识点:

  1. 关键字“self”的工作原理是:它会调用当前类(current class)的方法
     
  2. static关键字和延迟静态绑定(late static binding)
    在PHP5.3中,加入了一个新的特性,叫做延迟静态绑定。它可以帮我们实现多态,解决上面的问题。简单来说,延迟静态绑定意味着,当我们用static关键字调用一个继承方法时,它将在运行时绑定调用类(calling class)。在上面的例子中,如果我们使用延迟静态绑定(static),意味当我们调用“Mercedes::model();”时,class Mercedes中的getModel方法将会被调用。因为Mercedes是我们的调用类

  3. 区别在于:self引用的是当前类(current class)而static允许函数调用在运行时绑定调用类(calling class)。

父类模型:

<?php

namespace App\Model\Entity;

use Swoft\Db\Eloquent\Model;

class Base extends Model
{
    /**
     * 实例对象
     */
    protected static $instance;

    /**
     * 单例模式优化
     */
    public static function getInstance()
    {
        if (static::$instance instanceof static){
            # 如果实例已经创建了
            return static::$instance;
        }
        static::$instance = new static();
        return static::$instance;
    }

    #禁用初始化函数和克隆函数, 禁止new 实例化和clone 实例化
    private function __construct(){

    }

    public function __clone()
    {

    }

}

子类模型

<?php

namespace App\Model\Entity;


class GoodModel extends Base
{
    
    public function getListByPage($page)
    {
        return "diaknbifakbi";
    }
}

ok , 很完美

调用时直接 模型::getInstance调用就行了 , 也不是很难用  阅读也很方便

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苗先生的PHP记录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值