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

PHP 지연 정적 바인딩

巴扎黑
巴扎黑원래의
2016-11-11 17:29:421206검색

최근 한 프로젝트에서 이러한 경우를 겪었습니다. 성능을 높이려면 모든 Model 클래스가 싱글톤이어야 한다고 생각합니다. 모든 모델이 통합된 상위 클래스인 BaseModel을 상속하므로 간단한 데모를 위해 BaseModel에 싱글톤을 제어하는 ​​코드를 추가하세요. 다음과 같습니다:

Java 코드

/*Base class*/

class BaseModel

{

비공개 정적 $instance = null

공개 정적 함수 인스턴스()

{

if (비어 있음) ( self::$instance)) {

self::$instance = new self()

}

return self::$instance;

}  

}  


그런 다음 각 논리적 하위 클래스 모델  

Java 코드 

/*상품 클래스*/

class GoodModel은 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:: 호출된 변수는 클래스의 변수일 뿐이며, 클래스가 상속되더라도 변수는 재정의됩니다. self:: 함수는 상위 클래스에서 호출된 변수는 여전히 덮어쓴 값 대신 상위 클래스의 변수 값을 출력합니다.


따라서 정적 바인딩을 지연하려면 static 키워드를 사용해야 합니다. static은 하위 클래스
코드는 다음과 같습니다.


Java 코드

/*base class*/

class BaseModel

{

비공개 정적 $instance = null

공개 정적 함수 인스턴스()

{

if (empty(self::$instance)) {

self::$instance = new static()

}

return self::$instance;

}

}

이때 $good은



Java 코드

object(GoodModel)#1 (0) {

}

실제로 get_called_class 함수는 또한 위의 문제를 해결하기 위한 코드는 다음과 같습니다.


Java 코드

class BaseModel

{

비공개 정적 $instance = null

공개 정적 함수 인스턴스()

{

if (empty(self ::$인스턴스)) {

                                                           $className                 ~            🎜>

return self::$instance

    }  

}


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