今天看了一下以前的模型代码
发现控制器中不断的在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基础 , 但是不太常用的知识
知识点:
- 关键字“self”的工作原理是:它会调用当前类(current class)的方法
-
static关键字和延迟静态绑定(late static binding)
在PHP5.3中,加入了一个新的特性,叫做延迟静态绑定。它可以帮我们实现多态,解决上面的问题。简单来说,延迟静态绑定意味着,当我们用static关键字调用一个继承方法时,它将在运行时绑定调用类(calling class)。在上面的例子中,如果我们使用延迟静态绑定(static),意味当我们调用“Mercedes::model();”时,class Mercedes中的getModel方法将会被调用。因为Mercedes是我们的调用类。 -
区别在于: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调用就行了 , 也不是很难用 阅读也很方便