为了账号安全,请及时绑定邮箱和手机立即绑定

php的单例模式讲解

标签:
PHP

<?php

/*

场景:

class mysql {

}



$my1 = new mysql();

$my2 = new mysql();

$my3 = new mysql();


每new一次,连接一次数据库

同时,多了一个对象,增大的开销



另一种场景:购物车

如果我打开多个页面,每个页面实例了多个购物车

那么下的订单,可能会被装在不同的购物车里,出现错误.

所以,购物车,也得保证,只有有一个实例.



问:如何保证让大家使的$my1,$my2,$my3,是同一个对象?

*/


//类的静态属性

//类的静态属性和其他属性不一样

/*

class human{

static public $leg=2;

public $name;

public function __construct($name){

$this->name=$name;

}

public function showlegs(){

echo self::$leg;

}

}

$zhangsan=new human('张三');

$lisi=new human('李四');

print_r($zhangsan);// 多个对象,就有多个name普通属性.

print_r($lisi);

$lisi->showlegs();

*/

/*

class human{

static public $leg=2; // 这个数字2不属于张三,不属于李四,而属于全人类

static public function ins(){

echo 'aaa';

echo self::$leg;

//echo $this->name;// Using $this when not in object context self 是指类本身 $this是指对象本身

}

public $name;

public function _construct($name){

$this->name=$name;

}

public function showleg(){

echo self::$leg;

}

}

$zhangsan=new human('张三');

$lisi=new human('李四');

// 不创建任何实例/对象, 调用human的$leg静态属性

human::ins();

/*

1:静态属性/方法,属于全类,而不属于对象.

2:在内存中,只有一份.

3:调用静态属性/方法,用类名::$属性名,类名::方法名()来调用, 不依赖对象

*/

//单例模式第0步

/*

class mysql{

public $rand;

public function __construct(){

$this->rand=rand(10000,99999);

}

}

$m1=new mysql();

$m2=new mysql();

print_r($m1);

print_r($m2);

*/

//单例模式第一步不允许进行new操作

/*

class mysql{

public $rand;

protected function __construct($rand){

$this->rand=$rand;

}

}

$m1=new mysql;

*/

//在类中开放一个借口进行实例化对象

/*

class mysql{

public $rand;

static function ins(){

return new mysql;

}

protected function __construct(){

$this->rand=rand(1000,9999);

}

}

$m1=mysql::ins();

$m2=mysql::ins();

print_r($m1);

print_r($m2);

*/

// 单例模式第3步,加判断,判断该类的实例是否已经存在.

class mysql{

public $rand;

static public $flag=null;

static function ins(){

if(self::$flag){

self::$flag=new mysql;

return self::$flag;

}

return self::$flag;

}

 final protected function __construct(){

$this->rand=rand(1000,9999);

}

}

$m1=mysql::ins();

$m2=mysql::ins();


class my extends mysql{

public $name;

}

//$m1=new my();不能被new了

//$m2=new my();不能被new了

print_r($m1);

print_r($m2);

if($m1===$m2){

echo '是同一个对象';

}

else{

echo "不是一个对象";

}

// 问题:子类继承时,允许同名方法覆盖父类的同名方法,且权限越来越宽松.

// 某个方法,继承可以,但是不允许重写.

// final,关键字.可以修饰类名  方法名 修饰类名的时候不能继承 修饰方法的时候不能重写

//还有可能通过克隆得倒两个对象


?>


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消