찾다
php教程php手册PHP职责模式单例模式

模式对于面向对象开发是相当重要的。一种模式可以帮助我们创建能够实现特定任务的对象,成为类的职责。模式还允许我们修改某个类,但不需要修改与这个类有关系的代码,这个称为类的多态。

单例模式又称为职责模式,它用来在应用程序中创建一个单一的功能访问点。下面我们来探讨并且结结实实地掌握单例的思想还有应用。

在复杂的系统中,使用单例模式在维持应用程序状态的同步方面尤其有用。所有的单例类至少拥有以下三个元素:

  • 一个标记为private的构造函数。
  • 保存类的实例的静态成员变量。
  • 访问这个实例的公共静态方法。

Program List:单例模式的类

<?php
class Fruit
{
    // Hold an instance of the class
    private static $instance;
    
    // A private constructor; prevents direct creation of object
    // 防止类被当作实例使用,就是无法使用此类创建对象
    private function __construct() 
    {
        echo 'I am constructed';
    }
    // The singleton method
    public static function singleton() 
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }
    
    // Example method
    public function showColor()
    {
        echo 'My color is !';
    }
    // Prevent users to clone the instance
    public function __clone()
    {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }
}
// This would fail because the constructor is private
//$test = new Fruit();
// This will always retrieve a single instance of the class
$test = Fruit::singleton();
echo '<br />';
$test->showColor();
// This will issue an E_USER_ERROR.
//$test_clone = clone $test;
?>

程序运行结果:

I am constructed
My color is !

从这个程序可以看出一些特别的东西。和普通的类不同,单例类是不能直接实例化的,它只能被自身实例化。要获得这种效果,__construct()方法必须被标记为private。如果试图用private构造函数构造一个对象,就会得到一个访问性级别的错误。

那么单例类如何起作用呢?单例类就是要向其它类提供一个实例,用它调用各种方法。单例类回通过内部存储的实例返回一个引用,所以单例类不会重复占用内存和系统资源,从而让应用程序的其它部分更好的使用资源。所以,你的数据库访问最好使用单例模式构建,那么就不会创建太多的数据库连接实例,从而让你的系统跑得更快。

一个空的__clone()方法很有必要,它可以防止对象被复制或者克隆。

self::$instance 可以检测到类是否已经被初始化。如果保存实例的静态成员为空或者还不是类自身的一个实例,那么这个实例将会被创建并保存到存放实例的变量中。

Program List:无private构造函数的单例

一个不严格的单例,没有private构造函数,也没有本身的引用。不知道还算不算模式了。

  
<?php
class Fruit {
  	public static $height = 2;
  	public static $weight = 2;
  	public static function getInstance() {
    	return new Fruit();
  	}
  	public function getHeight() {
    	return self::$height;
  	}
  	public function getWeight() {
    	return self::$weight;
  	}
  	public function setHeight($value) {
    	if($value > 0 && $value < 100) self::$height = $value;
  	}
  	public function setWeight($value) {
    	if($value > 0 && $value < 100) self::$weight = $value;
  	}
  	public function __toString() {
    	return 'Fruit[height=' . self::$height . ', weight=' . self::$weight . ']';
  	}
}
// try to set data before any objects is created
Fruit::$height = 55;
$msm1 = Fruit::getInstance();  // use the getInstance() method
$msm2 = new Fruit();           // use the default constructor
$msm2->setWeight(78);                           // set data with an instantiated object
echo $msm1 . '<br />';
echo $msm2 . '<br />';
echo Fruit::getInstance() . '<br>';
echo (new Fruit());
?>

程序运行结果:

Fruit[height=55, weight=78]
Fruit[height=55, weight=78]
Fruit[height=55, weight=78]
Fruit[height=55, weight=78]

Program List:数据库连接职责

<?php
	class Database {
		private $_db;
		static $_instance;
		
		private function __construct() {
			$this->_db = pg_connect('dbname=example_db');
		}
		
		private __clone() {};
		
		public static function getInstance() {
			if( ! (self::$_instance instanceof self) )
			{
				self::$_instance = new self();
			}
			return self::$_instance;
		}
		
		public function query($sql)
		{
			return pg_query($this->_db,$sql);
		}
	}
?>

如何使用这个单例类?

$db = Database::getInstance();
$db->query('SELECT * FROM example_table');

也就是获取对象的方法有些区别而已,使用起来与其它对象没有特别之处。

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)