php设计模式之单例模式

本文深入探讨了PHP中的单例模式实现,解析了其核心概念,包括静态私有属性的作用、构造函数私有化的原因及如何通过静态方法提供统一访问入口。同时,介绍了PHP中this、self、parent指针的区别及类内外读取静态变量的方法。

废话就不说了,先看图,看不懂也不要紧,粘贴代码运行一下,在看看途中的相关文字吧。
在这里插入图片描述

<?php
class Person1 {}
/**
*  单例模式
**/
class Person
{
  /*
    * 知识点:
    * 必须先声明一个静态私有属性:用来保存当前类的实例
    * 1. 为什么必须是静态的?因为静态成员属于类,并被类所有实例所共享
    * 2. 为什么必须是私有的?不允许外部直接访问,仅允许通过类方法控制方法
    * 3. 为什么要有初始值null,因为类内部访问接口需要检测实例的状态,判断是否需要实例化
    * 扩展点:
    * 1. php中this、self、parent的含义和类内(外)的使用方法
        this是指向当前对象的指针(姑且用C里面的指针来看吧)
          self是指向当前类的指针
          parent是指向父类的指针
        在***类中***读取***静态变量***的方法:
            echo "静态字段:<br>";
            echo "类名读取:".Person::$str."<br>";
            echo "self读取:".self::$str."<br>";
            echo "this读取:".$this::$str."<br>";
        在***类外***读取***静态变量***的方法:
            echo "类名读取:".Person::$str."<br>";
      2.注意事项dian

    * 
    * 
    * 
  */
  public static $instance;

  public static $str = "123123";
  private static $varStr;
  private $personInfo;//用户基本信息组

  //私有化构造函数,防止外界实例化对象
  private function __construct($name ,$age ,$gender)
  {
    $this->personInfo = array(
        'name' => $name,
        'age'  => $age,
        'gender' => $gender
    );
  }
  //私有化克隆函数,防止外界克隆对象
  private function __clone()
  {

  }
  //单例访问统一入口
  public static function getInstance($name ,$age ,$gender)
  {
    //写法1
    if(!(self::$instance instanceof Person)) self::$instance = new Person($name ,$age ,$gender);

    //写法2
    // if(!(self::$instance instanceof self)) self::$instance = new self($name ,$age ,$gender);

    return self::$instance;
  }
  //数据库查询操作
  public function getinfo()
  {
    return $this->personInfo;
  }

  public static function 静态方法($_varStr){
    Person::$varStr = $_varStr;
    echo '获取静态公共变量'.self::$str."<br>";
    echo '给静态私有变量赋值---------'.Person::$varStr."<br>";

  }
}
echo '在未实例化对象时,调用类静态方法“静态方法”'."<br>";
Person::静态方法('我是类静态方法');


$obj1 = new Person1;
$obj2 = new Person1;
var_dump($obj1,$obj2);
echo '<hr>';

//实例化单例Person类
$obj1 = Person::getInstance('Tom',25,'男');
$obj2 = Person::getInstance('jerry',36,'女');
var_dump($obj1,$obj2);

?>

注意代码中的注释点啊!!!!!!!!!!!!


扩展点

变量内存存储
php单例内容扩展链接

### PHP 单例模式懒汉式实现及构造函数私有原因 在 PHP 中,单例模式的懒汉式实现确保了类的实只有在需要时才被创建。以下是关于懒汉式单例模式的具体实现及其构造函数必须为私有的原因: #### 懒汉式单例模式的实现 懒汉式单例模式通过延迟实化的方式,在首次调用 `getInstance()` 方法时才创建类的唯一实[^2]。以下是一个标准的懒汉式单例模式实现示: ```php class LazySingleton { // 静态变量用于存储唯一实 private static $instance = null; // 私有化构造函数,防止外部实化 private function __construct() { // 初始化逻辑 } // 禁止克隆实 private function __clone() { } // 禁止反序列化实 private function __wakeup() { } // 静态方法用于获取唯一实 public static function getInstance() { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; } } ``` #### 构造函数必须为私有的原因 构造函数被声明为 `private` 的主要目的是防止外部代码通过 `new` 操作符直接实化该类的对象。如果构造函数是 `public` 或 `protected`,则其他代码可以通过 `new LazySingleton()` 创建新的实,这将破坏单例模式的核心原则——确保只有一个实存在[^4]。 具体来说: - 私有化构造函数可以完全控制对象的创建过程,确保只有通过 `getInstance()` 方法才能获得类的实。 - 这种设计避免了意外或恶意创建多个实的情况,从而维护了全局唯一性的约束。 #### 双重检测锁定(线程安全) 在多线程环境下,为了确保懒汉式单例模式的安全性,通常会使用双重检测锁定机制。以下是一个线程安全的懒汉式单例模式实现: ```php class ThreadSafeLazySingleton { private static $instance = null; private function __construct() { // 初始化逻辑 } private function __clone() {} private function __wakeup() {} public static function getInstance() { if (self::$instance === null) { synchronized(self::class) { if (self::$instance === null) { self::$instance = new self(); } } } return self::$instance; } } ``` 在这个实现中,`synchronized` 块确保了在多线程环境下,只有第一个线程能够进入实化逻辑,其他线程必须等待直到实创建完成[^3]。 #### 总结 懒汉式单例模式通过延迟实化的方式,在需要时才创建类的唯一实。构造函数必须为私有的原因是防止外部代码通过 `new` 操作符直接实化对象,从而破坏单例模式的核心原则。此外,在多线程环境中,可以通过双重检测锁定机制来确保线程安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值