废话就不说了,先看图,看不懂也不要紧,粘贴代码运行一下,在看看途中的相关文字吧。
<?php
class Person1 {}
/**
* 单例模式
**/
class Person
{
/*
* 知识点:
* 必须先声明一个静态私有属性:用来保存当前类的实例
* 1. 为什么必须是静态的?因为静态成员属于类,并被类所有实例所共享
* 2. 为什么必须是私有的?不允许外部直接访问,仅允许通过类方法控制方法
* 3. 为什么要有初始值null,因为类内部访问接口需要检测实例的状态,判断是否需要实例化
* 扩展点:
* 1. php中this、self、parent的含义和类内(外)的使用方法
this是指向当前对象的指针(姑且用C里面的指针来看吧)
self是指向当前类的指针
parent是指向父类的指针
在***类中***读取***静态变量***的方法:
echo "静态字段:<br>";
echo "类名读取:".Person::$str."<br>";
echo "self读取:".self::$str."<br>";
echo "this读取:".$this::$str."<br>";
在***类外***读取***静态变量***的方法:
echo "类名读取:".Person::$str."<br>";
2.注意事项dian
*
*
*
*/
public static $instance;
public static $str = "123123";
private static $varStr;
private $personInfo;//用户基本信息组
//私有化构造函数,防止外界实例化对象
private function __construct($name ,$age ,$gender)
{
$this->personInfo = array(
'name' => $name,
'age' => $age,
'gender' => $gender
);
}
//私有化克隆函数,防止外界克隆对象
private function __clone()
{
}
//单例访问统一入口
public static function getInstance($name ,$age ,$gender)
{
//写法1
if(!(self::$instance instanceof Person)) self::$instance = new Person($name ,$age ,$gender);
//写法2
// if(!(self::$instance instanceof self)) self::$instance = new self($name ,$age ,$gender);
return self::$instance;
}
//数据库查询操作
public function getinfo()
{
return $this->personInfo;
}
public static function 静态方法($_varStr){
Person::$varStr = $_varStr;
echo '获取静态公共变量'.self::$str."<br>";
echo '给静态私有变量赋值---------'.Person::$varStr."<br>";
}
}
echo '在未实例化对象时,调用类静态方法“静态方法”'."<br>";
Person::静态方法('我是类静态方法');
$obj1 = new Person1;
$obj2 = new Person1;
var_dump($obj1,$obj2);
echo '<hr>';
//实例化单例Person类
$obj1 = Person::getInstance('Tom',25,'男');
$obj2 = Person::getInstance('jerry',36,'女');
var_dump($obj1,$obj2);
?>
注意代码中的注释点啊!!!!!!!!!!!!
扩展点