首页IT科技php写一个简单的单例模式怎么写(浅谈PHP设计模式的单例模式)

php写一个简单的单例模式怎么写(浅谈PHP设计模式的单例模式)

时间2025-05-02 09:40:39分类IT科技浏览3148
导读:简介: 单例模式是创建型对象的一种,用于如何优雅的创建对象。 让一个类最多产生一个对象。 场景:...

简介:

单例模式是创建型对象的一种            ,用于如何优雅的创建对象        。

让一个类最多产生一个对象                。 场景:

只需要一个对象就能解决并且要使用多次的场景              ,比如框架的数据库连接      。

优点:

减少资源消耗    ,一个对象能完成的事情         ,就不需要再实例化出来同样的东西      。

缺点:

对象生命周期都是页面级的               ,每次页面被执行时      ,都会重新建立新的对象      ,都会在页面执行完毕后被清空                ,这样似乎PHP单例模式意义不大               。

示例代码: class Demo { //声明一个存储对象的方法 private static $obj; //防止当前类的外部进行实例化 private function __construct() {} //防止当前类的外部进行克隆 private function __clone() {} //声明一获取示例的方案 public static function getInstance() { if(self::$obj === null) { self::$obj = new self(); } return self::$obj; } public function otherFunction() { //todo ... } } 测试代码: class Demo { //声明一个存储对象的方法 private static $obj; //防止当前类的外部进行实例化 private function __construct() {} //防止当前类的外部进行克隆 private function __clone() {} //声明一获取示例的方案 public static function getInstance() { if(self::$obj === null) { //在此处打印数据到文件        ,可清楚的看出来执行了几次         。 //静态方法或者静态属性可以称之为类变量或者类属性   ,会随着类的加载一并加载到内存当中    。 file_put_contents(F:/stdout.txt, 1,FILE_APPEND); self::$obj = new self(); } return self::$obj; } public function otherFunction() { //todo ... } } //类的外部执行了5次实例化操作 for($i = 0; $i < 5; $i++) { Demo::getInstance(); } 升级版本:

如果每一个类都写一个单例模式的话                 ,会显得有重复的代码          ,为此可以用继承去解决这个问题              。

此时self就需要修改为static,不然self是当前对象而不是子类对象            。

static::方法或属性               ,这种使用称为后期静态绑定  。 这和但是static 修饰成员属性或者成员方法             ,一个是使用  ,一个是修饰             。 class Singleton { //声明一个存储对象的方法 private static $obj; //防止当前类的外部进行实例化 private function __construct() {} //防止当前类的外部进行克隆 private function __clone() {} //声明一获取示例的方案 public static function getInstance() { //检测$obj是否为空并是否不属于当前类 if(((static::$obj === null) && (! static::$obj instanceof static))) { static::$obj = new static(); } return static::$obj; } } class Test extends Singleton { public function func() { return mt_rand(0, 10); } } //使用: Test::getInstance()->func();

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
如何优化内部页面提升排名:策略与技巧 微信小程序自定义(【微信小程序】自定义组件(一))