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 중국어 웹사이트의 기타 관련 기사를 참조하세요!