Detaillierte Erläuterung der Probleme, die bei der Vererbung des PHP-Singleton-Modus auftreten

黄舟
Freigeben: 2023-03-06 16:50:01
Original
2462 Leute haben es durchsucht

Detaillierte Erklärung von PHPEinzelfallmodus und Vererbungaufgetretene Probleme

<?php
// 单例模式之继承

class Singleton
{
	protected static $ins = null;

	private final function construct() { }

	protected final function clone() { }

	// public static function getIns() {
		// if(self::$ins === null){
			// self::$ins = new self();
		// }
		// return self::$ins;
	// }
	
	public static function getIns() {
		if(static::$ins === null){
			static::$ins = new static();
		}
		return static::$ins;
	}
}

class Child extends Singleton
{
	// protected static $ins = null;
}

/*
输出结果为:
bool(true) object(Singleton)#1 (0) { }
问题:对象 $c1, $c2 竟然都是 Singleton 的实例 ???
解决方法:将 getIns() 方法中关键字 self 替换为 static, 利用后期静态绑定的特性
*/
$c1 = Child::getIns();
$c2 = Child::getIns();
var_dump($c1 === $c2); //true
var_dump($c1);

// ------------------------------------------------------------------------
// 另一个问题

/*
输出结果为:
bool(true) object(Child)#1 (0) { }
问题:对象 $c3 竟然是 Child 的实例, 实际上应该是 Singleton 的实例 ???
原因:因为 $ins 属性是从父类 Singleton 继承过来的, 当第一次调用 Child::getIns() 时, $ins = new Child()
	  当再次调用 Singleton::getIns() 时, $ins 已经被实例过了, 而且指向 Child 的实例,
	  所以此时 $c3 变成了 Child 的实例
解决方法:在 Child 类中, 声明自己独有的 $ins 属性
*/
$c3 = Singleton::getIns();
var_dump($c1 === $c3);
var_dump($c3);
Nach dem Login kopieren

später statisch gebundene getIns( ) Methode hat auch ein Problem:

Wenn das $ins-Attribut von Singleton auf privat gesetzt ist, muss die Unterklasse Child ihr eigenes $ins-Attribut festlegen,

Da static::$ins zunächst nach dem eigenen $ins-Attribut der Unterklasse sucht, die Unterklasse jedoch nicht deklariert ist und die übergeordnete Klasse sie nicht erben kann, wird zu diesem Zeitpunkt Child::getIns() aufgerufen

-Methode meldet einen Fehler:

Schwerwiegender Fehler: Auf die Eigenschaft Child::$ins in D:wampwwwmycodeDesignPatternSingleton.php in Zeile 27 kann nicht zugegriffen werden

Lösung:

Setzen Sie das $ins-Attribut der übergeordneten Klasse Singleton auf „geschützt“ oder setzen Sie das $ins-Attribut der Unterklasse „Child“

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Probleme, die bei der Vererbung des PHP-Singleton-Modus auftreten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage