找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 668|回复: 0

单例模式

[复制链接]

296

主题

38

回帖

1272

积分

管理员

积分
1272
发表于 2021-4-22 12:35:17 | 显示全部楼层 |阅读模式
  1. <?php
  2. /*
  3.         单例模式 singleton
  4.                
  5.                 目的:让对象只有一个存在!降低开销。
  6. */

  7. class Singleton
  8. {
  9.         // 4.用于存储实例的静态属性
  10.         protected static $instance = null;

  11.         // 1.将构造方法私有化,禁止用户在外部实例化对象
  12.         protected function __construct()
  13.         {
  14.                 var_dump(__METHOD__);
  15.         }

  16.         // 2.提供一个公有静态方法让用户获取实例
  17.         public static function getInstance()
  18.         {
  19.                 if (is_null(self::$instance))
  20.                 {
  21.                         var_dump('只会执行一次');
  22.                         // 5. 在内部实例化,并且将实例化的对象,存起来
  23.                         self::$instance = new self();
  24.                 }

  25.                 return self::$instance;
  26.         }

  27.         // 禁止外部复制对象
  28.         protected function __clone()
  29.         {

  30.         }
  31. }

  32. // $s1 = new Singleton();
  33. // var_dump($s1);

  34. // $s2 = new Singleton();
  35. // var_dump($s2);

  36. $obj = Singleton::getInstance();
  37. var_dump($obj);

  38. $obj1 = Singleton::getInstance();
  39. var_dump($obj1);

  40. $obj2 = Singleton::getInstance();
  41. var_dump($obj2);

  42. var_dump($obj1 === $obj2);
复制代码
Model
  1. <?php
  2. define('DB_HOST', 'localhost');
  3. define('DB_USER', 'root');
  4. define('DB_PASSWD', 'jiege');
  5. define('DB_NAME', 'test');
  6. define('DB_PORT', '3306');

  7. class Model
  8. {
  9.         // 定义一个静态属性存储实例
  10.         protected static $instance = null;

  11.         // mysqli 实例
  12.         protected $mysql = null;

  13.         // 结果集 实例
  14.         protected $result = null;

  15.         public function __construct()
  16.         {
  17.                 // mysql 的连接
  18.                 $this->mysql = $this->getConnect();
  19.         }

  20.         // 获取 MySQL 连接
  21.         public function getConnect()
  22.         {
  23.                 // 如果为null 则表示第一次获取连接
  24.                 if (self::$instance === null)
  25.                 {
  26.                         // echo '连接一次';
  27.                         self::$instance = new MySQLi(DB_HOST, DB_USER, DB_PASSWD, DB_NAME, DB_PORT);
  28.                 }

  29.                 return self::$instance;
  30.         }

  31.         public function find(int $id)
  32.         {
  33.                 // 组装SQL
  34.                 $sql = "select * from `{$this->table}` where `id` = {$id} limit 1";

  35.                 echo $sql . '<br>';

  36.                 $this->query($sql);

  37.                 return $this->fetch();
  38.         }

  39.         public function query($sql)
  40.         {
  41.                 // 发送执行
  42.                 $this->result = $this->mysql->query($sql);
  43.         }

  44.         protected function fetch() : array
  45.         {
  46.                 // 检索结果
  47.                 $rows = $this->result->fetch_all(MYSQLI_ASSOC);

  48.                 return $rows;
  49.         }

  50.         /*
  51.                 获取表名
  52.         */
  53.         public function getTable()
  54.         {
  55.                 return $this->table;
  56.         }
  57. }


  58. class User extends Model
  59. {
  60.         protected $table = 'user';
  61.        
  62. }

  63. $user = new User();

  64. $list = $user->find(1);
  65. echo '<pre>';
  66.         print_r($list);
  67. echo '</pre>';

  68. echo $user->getTable();

  69. class Products extends Model
  70. {
  71.         protected $table = 'products';
  72. }

  73. $product = new Products();
  74. $list = $product->find(2);
  75. echo '<pre>';
  76.         print_r($list);
  77. echo '</pre>';
  78. echo $product->getTable();
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|外汇论坛 ( 粤ICP备16021788号 )

GMT+8, 2024-5-10 14:56 , Processed in 0.073691 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表