再谈PHP单例模式Singleton
单例模式属于创建型模式,它是设计模式中最简单的一种模式,当然它的使用也是无处不在的。
单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。
当需要控制一个类的实例数量,且调用者可以从一个公共的众所周知的访问点访问时,我们就可以考虑使用单例模式了。
我们用 UML 来设计单例模式,当然在以后的设计模式的设计部分,我们都将采用 UML 来描述我们的设计,这样就更为形象化了。
从 UML 设计图中我们可以看出,为了让一个类只有一个实例,它必须创建一个静态变量,然后我们用一个公共静态的 Instance() 的方法来创建它,但是为了避免这个类自身的构造函数可以创建对象,我们将构造函数设置成 protected 或者 private,这样外部就只能通过 Instance() 的方法来创建一个静态的 Singleton 类。看来这样我们达到了我们的目的,接下来我们看代码:
public class Singleton { private static Singleton instance; protected Singleton() public static Singleton Instance() { if(instance != null) instance = new Singleton(); return instance; } }
由此看来,实现单例模式我们可以做下列几步:
- 在类中创建一个静态变量,变量类型为当前类;
- 在类中创建一个公共的静态方法,让用户可以通过此方法创建此类的静态对象;
- 最后将构造函数设置为 protected 或者 private。
Program List:最简单的单例类
<?php class Fruit { static private $_color; private function __construct() { } static public function singleton() { return isset(self::$_color) ? self::$_color : self::$_color = new self(); } } ?>
Program List:可扩展的单例类
一个可扩展的单例类看似不可能,但下面的程序很接近这种效果。
<?php class Test extends Fruit { public static function getInstance() { return Fruit::getSingleton(get_class()); } } ?> <?php class Fruit { /*********************** * HOW TO USE * * Inherit(extend) from Singleton and add getter: * * //public getter for singleton instance * public static function getInstance(){ * return Singleton::getSingleton(get_class()); * } * */ private static $instanceMap = array(); //protected getter for singleton instances protected static function getSingleton($className) { if(!isset(self::$instanceMap[$className])) { $object = new $className; //Make sure this object inherit from Singleton if($object instanceof Fruit) { self::$instanceMap[$className] = $object; } else { throw SingletonException("Class '$className' do not inherit from Singleton!"); } } return self::$instanceMap[$className]; } //protected constructor to prevent outside instantiation protected function __construct(){ } //denie cloning of singleton objects public final function __clone(){ trigger_error('It is impossible to clone singleton', E_USER_ERROR); } } ?> <?php class Apple extends Fruit { protected $rndId; protected function __construct(){ $this->rndId = rand(); } public function whatAmI(){ echo 'I am a Apple('.$this->rndId.')<br />'; } public static function getInstance(){ return Fruit::getSingleton(get_class()); } } class GreenApple extends Apple { public function whatAmI(){ echo 'I am a GreenApple('.$this->rndId.')<br />'; } public static function getInstance(){ return Fruit::getSingleton(get_class()); } } $apple1 = Apple::getInstance(); $apple2 = GreenApple::getInstance(); $apple1->whatAmI();// should echo 'I am a A(some number) $apple2->whatAmI();// should echo 'I am a B(some number) $apple1 = Apple::getInstance(); $apple2 = GreenApple::getInstance(); $apple1->whatAmI();// should echo 'I am a A(same number as above) $apple2->whatAmI();// should echo 'I am a B(same number as above) // $a = new A();// this should fail // $b = new B();// this should fail ?>
程序运行结果:
I am a Apple(4462) I am a GreenApple(8207) I am a Apple(4462) I am a GreenApple(8207)
Program List:单例类与其派生类
<?php class Fruit { // Hold an instance of the class private static $instance; // A private constructor; prevents direct creation of object protected function __construct() { echo 'I am constructed'; } // The singleton method public static function singleton($classname = __CLASS__) { if (!isset(self::$instance)) { self::$instance = new $classname; } return self::$instance; } } class Apple extends Fruit { public static function singleton() { return parent::singleton(__CLASS__); // NOTE The singleton method MUST return an instance. } public function showColor() { echo 'My Color is Red.'; } } $subclassInstance = Apple::singleton(); $subclassInstance->showColor(); ?>
程序运行结果:
I am constructed My Color is Red.

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.
