今天在学习php面向对象时,看到一个面向对象的面试题php
题目是这样的:mysql
+++++++面试题++++++++++面试
请用 PHP5 代码编写类实如今每次对数据库链接的访问中都只能得到惟一的一个数据库链接,具体链接数据库的详细代码忽略,请写出主要逻辑代码sql
+++++++++++++++++++数据库
单例模式有几个要点:django
1.类的构造函数必须标记为 private(私有) (访问控制:防止外部代码通地new 操做符建立对象) 来能在其它类中实例化,只能在类自身中进行实例化。设计模式
private fcuntion __construc()函数
2.拥用一个保存类实例的 私有静态成员变量学习
private static $ins ; //$ins 用来保存这个类的实例spa
3.拥有一个访问这个类实例的静态方法(经常使用getInstance()方法进行实例化单例类,经过instanceof操做符能够检测到类是否已经被实例化)
4.建立 私有的__clone 方法 ,防止对象被复制。
为何这么作呢?
一、php的应用主要在于数据库应用, 因此一个应用中会存在大量的数据库操做, 使用单例模式, 则能够避免大量的new 操做消耗的资源。
二、若是系统中须要有一个类来全局控制某些配置信息, 那么使用单例模式能够很方便的实现. 这个能够参看ZF的FrontController部分。
三、在一次页面请求中, 便于进行调试, 由于全部的代码(例如数据库操做类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();