PHP单态设计模式分步骤详解实现过程

单态设计模式的目的:一个类只生成一个实例。

1、动态方法new,每次实例化,都是一个新的对象。

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!--?php &lt;br ?--> /**
* 声明一个类
*/
class Model
{

function __construct()
{
echo "初始化对象
";
}

}

$p1 = new Model();
$p2 = new Model();

if ($p1===$p2) {
echo "Y";
} else{
echo "N";
}

/*
输出结果:
初始化对象
初始化对象
N
*/

?>

2、封装构造方法,禁止外部通过new实例化对象,那么通过对象内部的方法来实例化1个对象。(问题:内部的方法,只有通过对象访问)
3、使用static静态化修饰方法,这样可以在外部使用”类名::静态方法名”来访问。
4、/*在静态方法里实例化对象*/ 注意:静态成员时属于类的,而不属于任何对象,所以不能用$this来引用它,所以需要使用关键字”self”来访问其他静态成员。在使用静态方法时,在静态方法中只能访问静态成员。因为非静态的成员必须通过对象的引用才能访问,通常是使用$this完成的。
这一步使用:return new self; 实例化这个类。
每次实例化,还是会创建1个新的类。

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!--?php &lt;br ?--> class Model
{

private function __construct()
{
echo "初始化对象
";
}

public static function getModel(){
/*在静态方法里实例化对象*/
// return new $this;会报错,在静态方法中不能使用$this。
return new self;
}

}

$p1 = Model::getModel();
$p2 = Model::getModel();

// var_dump($p1);
// var_dump($p2);

if ($p1===$p2) {
echo "Y";
} else{
echo "N";
}

/*
访问结果:
初始化对象
初始化对象
N
*/
?>

5、增加一个判断。判断如果已经创建了1个对象,则直接返回当前的对象,如果为空则实例化对象。

步骤:(1)、定义一个静态的属性$newObj存储对象;
(2)、使用条件语句判断is_null(self::$newObj),则实例化对象。
备注:在类中声明的方法中,可以使用关键字”self”来访问其他静态成员,在类的成员方法中用来代表本类的关键字。

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!--?php &lt;br ?--> class Model
{
static private $newObj = NULL;
private function __construct()
{
echo "初始化对象
";
}

public static function getModel(){
/*在静态方法里实例化对象*/
// return new $this;会报错,在静态方法中不能使用$this。
if (is_null(self::$newObj)) {
return self::$newObj=new self;
} else{
return self::$newObj;
}
// return self::$newObj;

}

}

$p1 = Model::getModel();
$p2 = Model::getModel();

var_dump($p1);
var_dump($p2);

if ($p1===$p2) {
echo "Y";
} else{
echo "N";
}

/*
运行结果:
初始化对象
object(Model)[1]
object(Model)[1]
Y
*/
?>

插曲:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 方法1:正确
public static function getModel(){
if (is_null(self::$newObj)) {
return self::$newObj=new self;
} else{
return self::$newObj;
}
}

// 方法2:正确
public static function getModel(){
if (is_null(self::$newObj)) {
self::$newObj=new self;
}
return self::$newObj;
}

// 方法3:错误
public static function getModel(){
if (is_null(self::$newObj)) {
self::$newObj=new self;
} else{
return self::$newObj;
}
}
// 方法3错误的原因是:$p1为空,没有return返回,所以生成1个NULL值