不积跬步无以至千里

记录精彩的程序人生

  • 首页
  • Java
  • Golang
  • PHP
  • Python
  • Nodejs
  • Lua
  • Docker
  • DevOps
  • 文章归档
  • 默认分类
  • 关于
  • 标签

  • 搜索
PostgreSQL hbase 时间同步 nexus 开机启动 nexus, 开机启动 jenkins安装配置 gitlab安装配置 gitlab安装 文件系统 fastdfs gcc切换 gcc升级 mysql8 交换空间 虚拟内存 tcp thrift lua tag test VPN SoftEtherVPN homebrew asm spring tomcat maven jdk ios mac 图案字符 figlet mysql半同步复制 mysql主从同步 一主多从 一主一从 主从同步 反向代理 密码重置 test 虚拟机扩容 swap 虚拟空间 docker ldocker grpc-gateway protobuf 微服务 go grp GRPC 授权登录 OAuth2.0 SOA supervisord supervisor RPC CentOS rabbitmq 环境变量 php-fpm php.ini error php7 lnmp 编译安装 mysql nginx linux java php python redis 字符串操作 mysql5.7 Solo

PHP的单例模式讨论(二)

发表于 2020-04-26 | 分类于 默认分类 | 0 | 阅读次数 1303

单例模式 有以下的特点:

  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一的实例。
  3. 单例类必须给所有其他对象提供这一实例。
代码:

Singleton.php :

<?php
class Singleton
{
private static $instance;

private function __construct()
{
}

public static function getInstance()
{
if(self::$instance == null)
{
self::$instance = new Singleton();
}

return self::$instance;
}
}
?>

在使用的时候,因为构造方法是private(私有)的,所以是不能直接实例化的,必须使用类似下面的方法:

例子:

<?php
require_once('Singleton.php ');

$instance = Singleton::getInstance();
?>

============================================

其它关于静态的说明

静态成员.
他在类被声明时就产生了,也就是在程序编译阶段产生的,它只有一个所有该类实例共享的原本,任何该类实例更改静态变量的值后,其它该类实例再去访问该静态变量,其值已经变成更改后的值,因为其在内存,就存一个原本。
非静态成员是在类实例化时产生的,你new一个该类实例,系统就会为该类实例的所有非静态成员新开辟一个空间,每个实例都只能自己的非静态成员。(有多少个类的实例,就要开辟多少个非静态成员的空间)

单例类全局只有一个实例,你可以把它看成全局对象。

从底层来说,编译完成后主要是两个部分,一是CPU指令,这一部分包含各种方法;二是数据,也就是程序定义的各种类型的变量。运行程序实例化一个对象时,按如下方式分配内存:
1。在程序启动时将静态数据和静态方法放入堆内存中。
2。第一次实例化对象时将其它方法放入代码段中。
3。每次实例化对象时将其它数据放入栈内存中。
实例化同一个对象时,上述1、2项不动,只是再加一个第3项即可。销毁一个实例的时候,如果还有其它的实例存在,就只释放该实例的栈数据段(上述第3项)。

根据以上原理回答您的问题
静态方法和数据一般都是Public型的,用于类的极普遍的事物处理,可以在程序的任意地方调用,在整过程序运行过程中始终占用计算机内存,一搬少用。如果一个程序中的各个对象都用一个数据库的话,可以使用静态方法连接。

单件模式的实例销毁时可以释放所有的非静态方法和数据,,如果把这个类的所有方法都设计为静态的,这些方法将一直占用内存,浪费资源,不可取。

在new一个对象时,只是加一个数据段,并不重新加载方法和静态变量。

最后说一个变量传送的问题,网上很多朋友在回答类之间参数传递时都说用静态变量,我认为这种方法不好,本来加类的目的就是为了封装,如果用一个类似于全局变量的静态变量作为参数就大大削弱了封装的意义。

实际上,系统和应用程序对内存的管理相当复杂.
=======================下面摘自思归的文字

从表面上看,静态(static)成员可以通过 类名.成员名 来直接调用,而实例(instance)成员需要生成一个对象后才能调用。同一个操作,性能当然静态成员好

但其实区别是跟对象设计有关的,一般来说实例成员跟实例的状态有关,某个方法的调用可能需要访问当前对象的状态,并改变其状态,从而影响其他方法的结果

而静态成员是跟类本身有关,与单独的实例状态无关。但静态成员不要太多了,否则就沦为以前的procedural programming风格了,也许对象需要重新设计或重构。

静态成员往往会在多线程下操作,需要做同步化控制

PHP单例模式经典讲解
PHP高级对象构建 工厂模式的使用
  • 文章目录
  • 站点概览
ken

ken

记录精彩的程序人生

498 日志
9 分类
77 标签
RSS
Creative Commons
Links
  • 酷壳
0%
© 2010 — 2026 ken
由 Halo 强力驱动
鄂ICP备18013899号-1