PHPシングルトンモードの継承時に発生する問題の詳細な説明

黄舟
リリース: 2023-03-06 16:50:01
オリジナル
2384 人が閲覧しました

PHPの詳細な説明シングルケースモード継承発生した問題

<?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);
ログイン後にコピー

後期静的バインディングのgetIns()メソッドには別の問題があります:

Singletonの$ins属性が設定されている場合はい、サブクラスの子は独自の $ins 属性

を設定する必要があります。これは、static::$ins が最初にサブクラス独自の $ins 属性を探すためですが、サブクラスは宣言されておらず、親クラスはそれを継承できないためです。 、この時点で子が呼び出されます::getIns()

メソッドはエラーを報告します:

致命的なエラー: 27 行目の D:wampwwwmycodeDesignPatternSingleton.php のプロパティ Child::$ins にアクセスできません

解決策:

親クラス Singleton の $ins 属性を protected に設定するか、サブクラス Child の独自の $ins 属性を設定します

以上がPHPシングルトンモードの継承時に発生する問題の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!