Welcome to the website navigation,本站只接受合法正规的企业网站,欢迎站长们提交你的网站获得展示和流量有任何问题请联系站长,欢迎大家加入本站。

                
提交网站
  • 网站:76083
  • 待审:5
  • APP:577
  • 文章:304416
  • 会员:56004
文字内链包年1000元 文字内链包年1000元 文字内链包年1000元 AI办公网站 AI绘画工具 AIchat

名站导航为爱好php程序的朋友们提供php相关的教程知识。

模式对于面向对象开发是相当重要的。一种模式可以帮助我们创建能够实现特定任务的对象,成为类的职责。模式还允许我们修改某个类,但不需要修改与这个类有关系的代码,这个称为类的多态。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

单例模式又称为职责模式,它用来在应用程序中创建一个单一的功能访问点。下面我们来探讨并且结结实实地掌握单例的思想还有应用。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

在复杂的系统中,使用单例模式在维持应用程序状态的同步方面尤其有用。所有的单例类至少拥有以下三个元素:2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

一个标记为private的构造函数。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

保存类的具体实例操作的静态成员变量。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

访问这个具体实例操作的公共静态方法。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

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;
?>

程序运行结果:2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

I am constructed
My color is !

从这个程序可以看出一些特别的东西。和普通的类不同,单例类是不能直接具体实例操作化的,它只能被自身具体实例操作化。要获得这种效果,__construct()方法必须被标记为private。如果试图用private构造函数构造一个对象,就会得到一个访问性级别的错误。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

那么单例类如何起作用呢?单例类就是要向其它类提供一个具体实例操作,用它调用各种方法。单例类回通过内部存储的具体实例操作返回一个引用,所以单例类不会重复占用内存和系统资源,从而让应用程序的其它部分更好的使用资源。所以,你的数据库访问最好使用单例模式构建,那么就不会创建太多的数据库连接具体实例操作,从而让你的系统跑得更快。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

一个空的__clone()方法很有必要,它可以防止对象被复制或者克隆。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

self::$instance 可以检测到类是否已经被初始化。如果保存具体实例操作的静态成员为空或者还不是类自身的一个具体实例操作,那么这个具体实例操作将会被创建并保存到存放具体实例操作的变量中。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

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

一个不严格的单例,没有private构造函数,也没有本身的引用。不知道还算不算模式了。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

  <?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());
?>

程序运行结果:2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

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);
		}
	}
?>

如何使用这个单例类?2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

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

也就是获取对象的方法有些区别而已,使用起来与其它对象没有特别之处。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

名站网址导航

PhP程序单例模式Singleton2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

单例模式保证一个类仅有一个具体实例操作,并提供一个访问它的全局访问点。2fOAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

好了关于php程序的知识就说到这里希望可以帮助需要的朋友。,

标签:

分享到:

  admin

注册时间:

网站:0 个   APP:3 个  文章:0 篇

  • 76083

    网站

  • 577

    APP

  • 304416

    文章

  • 56004

    会员

赶快注册账号,推广您的网站吧!
文章分类
热门网站
最新入驻APP小程序

宝贝市场2023-02-08

宝贝市场——买手和卖家商品展示

夺宝助手2023-02-08

夺宝助手小程序,查看每日快夺宝平

查诚信2023-02-08

查诚信是一款免费的商业查询工具

车价天天报2023-02-08

快速连接汽车销售,获知汽车最新报

考勤助理小程序2023-02-08

上班签到考勤,实时定位,后台轻松

汽车报价大全查询2023-02-08

汽车报价大全查询提供最新汽车市