三私一公:
1. 私有化属性
2. 私有化构造方法
3. 私有化克隆方法
4. 公有化静态方法,供外部调用
单例类:
<?php namespace app; class Database { /** * 私有化静态属性 */ private static $db; /** * 私有化构造方法 * Database constructor. */ private function __construct(){} /** * 私有克隆方法 * Database constructor. */ private function __clone(){} /** * 公有化静态方法 */ static public function getInstance() { if (! self::$db) { // 实例化自身,并且保存在属性中,静态属性将在程序结束时释放 self::$db = new self(); } return self::$db; } /** * 测试方法,这里只能是public */ public function test() { return "测试成功"; } }
在需要用到该类的地方用一下方法调用
<?php spl_autoload_register(function ($class) { include $class . ‘.php‘; }); // 单例中的方法只能通过getInstance这个静态属性来调用 $res = \app\Database::getInstance()->test(); echo $res;
最后附上我的目录结构,方便对比命名空间
单例到此完成了,但是上面有一句话需要注意:实例化自身,并且保存在属性中,静态属性将在程序结束时释放
为什么说单例减少资源浪费,主要是因为静态属性是保存在内存中的,因为静态属性是放在内存中的全局区(下图中的数据区),该区内的资源会一直在内存中,当程序结束时才会被释放。
以下是百度到的内存区块说明图,仅供参考:
原文:https://www.cnblogs.com/waterliang/p/12158849.html