//空对象
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);