최근 한 프로젝트에서 이러한 경우를 겪었습니다. 성능을 높이려면 모든 Model 클래스가 싱글톤이어야 한다고 생각합니다. 모든 모델이 통합된 상위 클래스인 BaseModel을 상속하므로 간단한 데모를 위해 BaseModel에 싱글톤을 제어하는 코드를 추가하세요. 다음과 같습니다.
Java 코드
/*基类*/ class BaseModel { private static $instance = null; public static function instance() { if (empty(self::$instance)) { self::$instance = new self(); } return self::$instance; } }
각 논리적 하위 클래스 모델
Java 코드
/*商品类*/ class GoodModel extends BaseModel{ public function getInfoById($goodId){ return array( 'id'=>$goodId, 'name'=>'小苹果', 'logo'=>'http://t3.qlogo.cn/mbloghead/65518bb9e5287fcd5864/180' ); } } ################################################################ $good = GoodModel::instance(); var_dump($good);
이런 $good은
Java 코드
object(BaseModel)#1 (0) { }
불필요한 GoodModel
자기소개가 필요한 내용입니다
self::호출된 변수는 클래스의 변수일 뿐입니다. 클래스가 상속되어 변수를 덮어쓰더라도 상위 클래스의 self::called 함수는 여전히 상위 클래스의 변수 값을 출력하지 않습니다.
값을 덮어쓰려면 정적 바인딩을 지연하기 위해 static 키워드가 필요합니다. static은 하위 클래스를 나타냅니다.
코드는 다음과 같습니다.
Java 코드
/ *기본 클래스*/
class BaseModel { private static $instance = null; public static function instance() { if (empty(self::$instance)) { self::$instance = new static(); } return self::$instance; } }
이때 $good은
Java 코드
object(GoodModel)#1 (0) { }
실제로 get_called_class입니다. 함수를 사용하여 위 문제를 해결할 수도 있습니다. 질문, 코드는 다음과 같습니다
Java 코드
class BaseModel { private static $instance = null; public static function instance() { if (empty(self::$instance)) { $className = get_called_class(); self::$instance = new $className(); } return self::$instance; } }