protected $db; //申明一个保护属性
private function __construct()
{
//构造一个私有方法
}
static function getInstance() // getInstance 获取实例
{
if(self::$db){
return self::$db;
}else{
self::$db = new self();
return self::$db
}
}
php单例模式
单例模式:类只允许创造一次,
1:类的构造方法__construct声明为private;
2:再创造一个静态方法去new自己;
3:再设置一个保护protected或私有private的属性,把new自己的对象赋给这个属性;
单例模式:避免重复多次实例化一个对象,造成资源浪费
Factory.php
<?php
namespace IMooc;
class Factory{
static function DataBase(){
$db = Database::getInstance();
return $db;
}
}
Database.php
<?php
namespace IMooc;
class Database{
private static $db;
//禁止通过外部实例化该类
private function __construct(){
}
//禁止通过外部客户该类
private function __clone(){
}
//静态方法中只能调用静态属性或者静态方法,非静态方法可以调用静态属性或者静态方法
static function getInstance(){
//instanceof 判断一个对象是否是某个类的实例 或是某个类的子类
if(self::$db instanceof self){
return self::$db;
}else{
self::$db = new self();
return self::$db;
}
}
}
index.php
<?php
define("BASEDIR",__DIR__);
require BASEDIR."/IMooc/Loader.php";
// 使用命名空间加载Loader类 当实例化的类不存在此文件中,都会调用spl_autoload_register方法,默认作用同__autoload方法相似 都会对使用到的类进行加载
spl_autoload_register可对使用的类进行重复加载 __autoload不会
\\IMooc\\Loader::autoload 命名空间下的某个类方法,该方法用来加载当前文件中不存在的类
spl_autoload_register("\\IMooc\\Loader::autoload");
$dbObject = IMooc\Factory::DataBase();
var_dump($dbObject);
Loader.php
<?php
namespace IMooc;
class Loader{
static function autoload($class){
require BASEDIR."/".str_replace("\\","/",$class).".php";
}
}
# 单例模式
传统模式:某个类new之后都是一个新的对象。
如Database new 3遍之后:
$db1 = new \Core\Database(); $db2 = new \Core\Database(); $db3 = new \Core\Database(); var_dump($db1); var_dump($db2); var_dump($db3);
output:
object(Core\Database)#1 (0) {} object(Core\Database)#2 (0) {} object(Core\Database)#3 (0) {}
后面#的数字表示不同对象?
单例模式:只创建一个对象,之后再需要使用的话使用同一个对象。(不允许new,然后使用一个新的方法来使用前一个对象)
$db1 = \Core\Database::getInstance(); $db2 = \Core\Database::getInstance(); $db3 = \Core\Database::getInstance(); var_dump($db1); var_dump($db2); var_dump($db3);
output:
object(Core\Database)#1 (0) {} object(Core\Database)#1 (0) {} object(Core\Database)#1 (0) {}