必须先声明一个静态私有属性:用来保存当前类的实例
* 1. 为什么必须是静态的?因为静态成员属于类,并被类的所有实例所共享
* 2. 为什么必须是私有的?不允许外部直接访问,仅允许通过类方法控制方法
* 3. 为什么要有初始值null,因为类内部访问接口需要检测实例的状态,判断是否需要实例化
//单例 class Uni{ //创建静态私有的变量保存该类对象 static private $instance; //参数 private $config; //防止直接创建对象 private function __construct($config){ $this -> config = $config; echo "我被实例化了"; } //防止克隆对象 private function __clone(){ } static public function getInstance($config){ //判断$instance是否是Uni的对象 //没有则创建 if (!self::$instance instanceof self) { self::$instance = new self($config); } return self::$instance; } public function getName(){ echo $this -> config; } } $db1 = Uni::getInstance(1); $db1 -> getName(); echo "<br>"; $db2 = Uni::getInstance(4); $db2 -> getName();
构造函数设置为私有属性的时候,只会触发一次?!构造函数是在类实例化的时候触发。构造方法不能声明为static 。静态方法不能调用非静态的方法。 非静态方法是可以调用静态方法的。
原因:静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存。非静态方法是属于对象的,对象是在类加载之后创建的。也就是说静态方法先于对象存在,当你创建一个对象时,程序为其分配内存,一般是通过this指针来指向该对象。静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。在对象未存在时非静态方法也不存在,静态方法自然不能调用一个不存在的方法。
但是非静态方法也有办法调用静态方法: (new self())->func(); 类似这种。
class Test { public function func () { return ‘hello‘ ; } public static function action () { // 如何调用 func 方法 ? return (new self())->func(); } }
一、什么是单例模式
作为对象的创建模式,单例模式确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
https://www.cnblogs.com/sgm4231/p/9851725.html
原文:https://www.cnblogs.com/bneglect/p/10958094.html