单例即一个类是能有一个实例,并提供一个当前类的全局唯一访问入口(getInstance)。防止类被多次实例化和clone。
test(); // new Singleton(); // Fatal error: Uncaught Error: Call to private Singleton::__construct() from invalid context // clone $single1; // Fatal error: Uncaught Error: Call to private Singleton::__construct() from invalid context
输出:
object(Singleton)#1 (0) { } object(Singleton)#1 (0) { } 这是一个单例模式二、单例模式的应用
tp6框架容器中单例模式:
class Container implements ContainerInterface, ArrayAccess, IteratorAggregate, Countable { protected static $instance; protected $instances = []; protected $bind = []; protected $invokeCallback = []; public static function getInstance() { if (is_null(static::$instance)) { static::$instance = new static; } if (static::$instance instanceof Closure) { return (static::$instance)(); } return static::$instance; } // ... }数据库连接
query('set names utf8mb4'); self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die('error:' . $e->getMessage()); } } // 禁止clone private function __clone() { } public static function getInstance(): object { if (empty(self::$instance)) { self::$instance = new self(); } return self::$instance; } public function query(string $sql = ''): array { return self::$db->query($sql)->fetch(); } } $mysql = SingletonMysql::getInstance(); var_dump($mysql->query('SELECT VERSION();'));
输出结果:
array(2) { ["VERSION()"]=> string(6) "5.7.26" [0]=> string(6) "5.7.26" }
测试代码下载:
singleton.zip
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)