php中单例和工厂模式,PHP单例模式和工厂模式小记!

//空对象

new stdClass() == object(null);

//在php语言中,一个对象还可以使用clone运算符进行克隆,则就也会“生成”新对象。

//因此,还需要在类中使用私有化措施来禁止克隆,最终,单例模式的实现如下:

//单例模式4个关键点

class S{

public $v = 10;

private static $state;//存储实例化的类

private function __Construct(){}//私有化构造方法

public static function getNew(){

if(!isset(self::$state)){//如果没有实例化则实例化,实例化则直接返回

self::$state = new self;

}

return self::$state;

}

private function __clone(){}//禁止克隆

}

$s = S::getNew();

$m = S::getNew();

var_dump($s);

var_dump($m);

die;

class Factory

{

public static function M($classname )

{

if (@include_once $classname . '.php') {

return new $classname;

} else {

trigger_error('类文件不存在!', E_USER_ERROR);

// throw new Exception ('类文件不存在!');

}

}

}

$a = Factory::M("test");

$b = Factory::M("demo");

$c = Factory::M("hello");

var_dump($a);var_dump($b);var_dump($c);

//项目中的工厂类

class F{

//生成模型的单列对象

public static function M($name){

static $list = array();//存储已实例化的模型对象列表

if(!isset($list[$name])){//判断当前模型是否已实例化

require_once'./'.$name.'.class.php';

$list[$name] = new $name;//可变类

}

return $list[$name];

}

}

//类名,也习惯上(推荐)使用跟文件名相似的名字

//定义一个mysql连接类,该类可以连接mysql数据库

//并实现其单例模式

//该类的功能还能够完成如下基本mysql操作:

//执行普通的增删改非返回结果集的语句

//执行select语句并可以返回3种类型的数据:

//多行结果(二维数组),单行结果(一维数组)

//单行单列(单个数据)

class MySQLDB{

public $host;

public $port;

public $username;

public $password;

public $charset;

public $dbname;

//连接结果(资源)

private static $link;

private $resourc;

public static function getInstance($config){

if(!isset(self::$link)){

self::$link = new self($config);

}

return self::$link;

}

//构造函数:禁止new

private function __construct($config){

//初始化数据

$this->host = isset($config['host']) ? $config['host'] : 'localhost';

$this->port = isset($config['port']) ? $config['port'] : '3306';

$this->username = isset($config['username']) ? $config['username'] : 'root';

$this->password = isset($config['password']) ? $config['password'] : '';

$this->charset = isset($config['charset']) ? $config['charset'] : 'utf8';

$this->dbname = isset($config['dbname']) ? $config['dbname'] : '';

//连接数据库

$this->connect();

//设定连接编码

$this->setCharset($this->charset);

//选定数据库

$this->selectDb($this->dbname);

}

//禁止克隆

private function __clone(){}

//这里进行连接

private function connect(){

$this->resourc = mysql_connect("$this->host:$this->port", "$this->username","$this->password") or die("连接数据库失败!");

}

public function setCharset($charset){

//mysql_set_charset($charset, $this->resourc);

$this->query("set names $charset");

}

public function selectDb($dbname){

//mysql_select_db($dbname, $this->resourc);

$this->query("use $dbname;") ;

}

//进行序列化的时候会调用

public function __sleep(){

echo "序列化。。。";

mysql_close($this->resourc);//关闭连接资源(清理资源)

//如果定义了该__sleep方法,则此时必须返回数组,才能进行序列化

return array('host','port','username','password','charset','dbname');

}

//进行反序列化的时候会调用

public function __wakeup(){

//连接数据库

$this->connect();

//设定连接编码

$this->setCharset($this->charset);

//选定数据库

$this->selectDb($this->dbname);

}

/**

* 功能:执行最基本(任何)sql语句

* 返回:如果失败直接结束,如果成功,返回执行结果

*/

public function query($sql){

if(!$result = mysql_query($sql, $this->resourc))

{

echo ("
执行失败。");

echo "
失败的sql语句为:" . $sql;

echo "
出错信息为:" . mysql_error();

echo "
错误代号为:" . mysql_errno();

die();

}

return $result;

}

/**

* 功能:执行select语句,返回2维数组

* 参数:$sql 字符串类型 select语句

*/

public function getAll($sql){

$result = $this->query($sql);

$arr = array(); //空数组

while( $rec = mysql_fetch_assoc( $result )){

$arr[] = $rec;//这样就形成二维数组

}

return $arr;

}

//返回一行数据(作为一维数组)

public function getRow($sql){

$result = $this->query($sql);

//$rec = array();

if( $rec2 = mysql_fetch_assoc( $result )){//返回下标为字段名的数组

//如果fetch出来有数据(也就是取得了一行数据),结果自然是数组

return $rec2;

}

return false;

}

//返回一个数据(select语句的第一行第一列)

//比如常见的:select count(*) as c from XXX where ...

public function getOne($sql){

$result = $this->query($sql);

$rec = mysql_fetch_row($result);//返回下标为数字的数组,且下标一定是0,1,2, 3.....

//如果没有数据,返回false

if($rec === false){

return false;

}

return $rec[0]; //该数组的第一项。

}

}

require './MySQLDB.class.php';

$dao = MySQLDB::getInstance($config);//$dao , Database Access Object 数据库操作对象(dao层)

//获得比赛列表数据

$sql = "select * from table;";

$match_list = $dao->getAll($sql);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值