PHP 싱글톤 모드 상속 시 발생하는 문제에 대한 자세한 설명

黄舟
풀어 주다: 2023-03-06 16:50:01
원래의
2455명이 탐색했습니다.

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 속성이 비공개로 설정된 경우 하위 클래스 Child는 자체 $ins 속성인

을 설정해야 합니다. static::$ins는 먼저 하위 클래스의 자체 $ins 속성을 찾지만 하위 클래스가 선언되지 않고 상위 클래스가 이를 상속할 수 없기 때문에 이때 Child::getIns()가 호출됩니다.

메소드는 오류를 보고합니다:

치명적인 오류: Cannot access property Child::$ins in D:wampwwwmycodeDesignPatternSingleton.php on line 27

해결책:

상위 클래스 Singleton의 $ins 속성을 protected로 설정하거나 하위 클래스 Child의 자체 $ins 속성을 설정합니다.

위 내용은 PHP 싱글톤 모드 상속 시 발생하는 문제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿