>  기사  >  백엔드 개발  >  PHP 지연 정적 바인딩

PHP 지연 정적 바인딩

巴扎黑
巴扎黑원래의
2016-11-11 13:13:50933검색

최근 한 프로젝트에서 이러한 경우를 겪었습니다. 성능을 높이려면 모든 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;  
    }  
}


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.