php 单例模式
今天在学习php面向对象时,看到一个面向对象的面试题
题目是这样的:
+++++++面试题++++++++++
请用单例设计模式方法设计类满足如下需求:
请用 PHP5 代码编写类实现在每次对数据库连接的访问中都只能获得唯一的一个数据库连接,具体连接数据库的详细代码忽略,请写出主要逻辑代码
+++++++++++++++++++
单例模式有几个要点:
1.类的构造函数必须标记为 private(私有) (访问控制:防止外部代码通地new 操作符创建对象) 来能在其它类中实例化,只能在类自身中进行实例化。
private fcuntion __construc()
2.拥用一个保存类实例的 私有静态成员变量
private static $ins ; //$ins 用来保存这个类的实例
3.拥有一个访问这个类实例的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)
4.创建 私有的__clone 方法 ,防止对象被复制。
为什么这么做呢?
1、php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。
2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。
3、在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
最终答案代码如下
<?php
class Mysql
{
private static $instance = null;
private $conn;
// 构造方法,设置为private,不允许通过new获得对象实例
private function __construct(argument)
{
$conn = mysql_connect("localhost","root","root");
}
// 获取实例方法
public static function getInstance()
{
if (!self::$instance instanceof self) {
self::$instance = new self;
}
return self::$instance;
}
// 禁止克隆
private function __clone(){}
}
// 获得对象
$db = Mysql::getInstance();
?>
再此做一下备忘录。
class Mysql { privatestatic $instance = null; private $conn; // 构造方法,设置为private,不允许通过new获得对象实例privatefunction __construct(argument) { $conn = mysql_connect("localhost","root","root"); } // 获取实例方法publicfunction getInstance() { if (!self::$instance instanceofself) { self::$instance = newself; } returnself::$instance; } // 禁止克隆privatefunction __clone(){} } // 获得对象 $db = Mysql::getInstance();