简介:本文主要介绍php单例模式中的权限和基础魔术方法、类的继承中self与static的区别。self和static的具体区别体现在new时的对象究竟是谁
<?php
//单例模式,一个类只能创建一个对象
class Single
{
//定义一个静态私有的属性来保存对象
private static $single;
//私有化构造方法,禁止从外部实例化当前类
private function __construct($param)
{
//此处只会执行一次
var_dump($param);
}
//私有化克隆方法,防止他人复制当前对象
private function __clone(){}
//开放一个入口,用于获取当前类的对象
public static function getInstance($param)
{
// 判断当前类是否已经实例化
// 没有则实例化,否则直接返回上次实例化的对象
if(!self::$single){
self::$single = new static($param);
}
return self::$single;
}
}
在上面的getInstance中我们使用 new static 来实例化对象,这种方式没有任何问题。如果我们使用 new self 来实例化,现在有一个A_object类继承 Single 类,A_object中定义一个自定义方法,实例化A_object后无法调用自定义方法。具体代码如下所示:
class A_object extends Single{
function test_self(){
var_dump('test_self');
}
}
$a = A_object::getInstance(null);
//如果getInstance使用new self方式实例化,会直接报错
$a->test_self();
为什么使用 new self 会报错,表示test_self方法找不到。这就是self与static的主要区别即指向不同
self 指的是当前类,如果子类继承某个单例时,无法使用子类的属性及子类的方法
static 会指向最终类,如果有子类继承,在外部实例化,实际实例化出来的是最终子类
有遗漏或者不对的可以在我的公众号留言哦