새로운 self();는 PHP에서 무엇을 의미합니까?
난 이런 코드를 본 적이 없어.
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
new className()
편집
클래스가 상속인 경우 어떤 클래스를 가리킵니까?
self
는, 그것이 쓰여져 있는 클래스를 가리킵니다.
이름 "getInstance"에 있는 MyClass
행: , 니다:
self::$_instance = new self();
다음과 같은 작업을 수행합니다.
self::$_instance = new MyClass();
[Edit] : 코멘트 뒤에 조금 더 자세한 정보가 표시됩니다.
서로 확장되는 클래스가2개 있는 경우는, 다음의 2개의 상황이 있습니다.
getInstance
.getInstance
되어 있습니다.
첫 번째 상황은 다음과 같습니다(이 예에서는 불필요한 코드를 모두 삭제했습니다.싱글톤 동작을 얻으려면 코드를 추가해야 합니다*).
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
여기서 얻을 수 있는 것은 다음과 같습니다.
object(MyChildClass)#1 (0) { }
, ,,self
「」를 의미합니다.MyChildClass
입니다.-- , 、 것 、 것 、 것 、 -- 、 -- -- -- -- -- -- -- 。
For the second situation, the code would look like this :
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
그리고 다음과 같은 출력을 얻을 수 있습니다.
object(MyParentClass)#1 (0) { }
, ,,self
「」를 의미합니다.MyParentClass
--즉, 여기서도, 그것이 쓰여진 클래스입니다.
With PHP That's why PHP 5.3 introduces a new usage for the
static
keyword : it can now be used exactly where we used
self
in those examples :
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
데...가 ...static
self
이렇게 .
object(MyChildClass)#1 (0) { }
은 즉, 그 말은static
사용되는 클래스에 대한 일종의 포인트(우린 사용했어요)MyChildClass::getInstance()
기재되어 있는 것이 아닙니다.
of, 동의 self
기존 어플리케이션을하지 않기 위해 되지 않았습니다. 5했을 뿐이며, 이 동작을 .PHP 5.3은 새로운 동작을 추가했을 뿐이며, 이 동작을 재활용합니다.static
키워드를 지정합니다.
And, speaking about PHP 5.3, you might want to take a look at the [Late Static Bindings][1] page of the PHP manual.
이것은 싱글톤 패턴의 실장이라고 생각됩니다.함수는 스태틱하게 호출되어 스태틱클래스에 변수가 있는지 여부를 확인합니다.$_instance
세트.
않으면 를합니다.new self()
합니다.$_instance
.
「 」에 className::getInstance()
싱글톤 패턴의 포인트인 모든 콜에 대해1개의 클래스인스턴스가 생성됩니다.
하지만 이런 식으로 하는 건 본 적이 없고, 솔직히 그게 가능한지 몰랐어요. 죠?$_instance
에서서 선언 ?? ????
패턴에서 가장 이되어 있습니다.이 패턴에서는 이중 콜론이 인스턴스화되지 않습니다.(::)
연산자는 클래스 내에서 정적으로 선언된 멤버에 액세스할 수 있습니다.따라서 정적 멤버가 있는 경우 의사 변수 $this는 사용할 수 없습니다.따라서 사용되는 코드는 데이터베이스 커넥터 핸들러와 같은 오브젝트의 인스턴스를 1개만 허용하는 좋은 프로그래밍 방법입니다.코드에서 으로써 이루어집니다.이 경우, 그는 이 액세스포인트를 「」라고 했습니다.이 경우 이 액세스포인트는 그가 이름을 붙인 것입니다.getInstance()
getInstance 자체는 기본적으로 새로운 키워드를 사용하여 객체를 만들고 컨스트럭터 메서드도 호출되었음을 의미합니다.
선로if(!isset(self::instance))
오브젝트가 이미 생성되었는지 확인합니다.코드가 fragment일 뿐이기 때문에 아마 상단의 어딘가에 스태틱멤버가 있을 거예요
private static $_instance = NULL;
일반 수업에서 우리는 간단히 이 멤버에게 접근했을 것이다.
$this->_instance = 'something';
단, static이라고 선언되어 있기 때문에 사용하는 $this code를 대신 사용할 수 없습니다.
self::$_instance
에 오브젝트가 는 단일 할지 여부를 할 수 하지 않는 ! 않으면 됩니다.부를 결정할 수 있습니다.따라서 이 인스턴스가 설정되어 있지 않으면 !isset, 즉 스태틱멤버 $_dispa에 객체가 존재하지 않음을 의미하며 새로운 객체를 생성하여 스태틱멤버에 저장합니다.$_instance
self::$_instance = new self();
클라이언트 코드로 되돌렸습니다.후를 퍼블릭메서드와할 수 이 접근포인트를합니다.getInstance()
까다롭기 때문에 합니다.
$thisObject = className::getInstance();
그 이유는 함수 자체가 정적인 것으로 선언되기 때문입니다.
,, 치, 마 거예요.new className()
( ( ( ( ( ( ( ( ( ( ( 。 컨스트럭터가 프라이빗인 싱글톤 패턴에서 사용되는 경우가 있습니다.
클래스가 상속된 경우 자녀에서 getInstance()를 호출해도 자녀 인스턴스는 제공되지 않습니다.부모 인스턴스의 인스턴스만 반환합니다.왜냐하면 우리는 새로운 자신을 부르기 때문입니다.
자녀 클래스가 자녀 클래스의 인스턴스를 반환하는 경우 getInstance()에서 새로운 static()을 사용하면 자녀 클래스 인스턴스가 반환됩니다.이것을 레이트 바인딩이라고 합니다!!
언급URL : https://stackoverflow.com/questions/2396415/what-does-new-self-mean-in-php
'programing' 카테고리의 다른 글
PHP YAML 파서 (0) | 2023.01.05 |
---|---|
JavaScript에서 어제 날짜 계산 (0) | 2023.01.05 |
C 오류: 함수에 대한 참조가 정의되지 않았지만 IS가 정의되었습니다. (0) | 2023.01.05 |
같은 컨트롤러에서 다른 기능을 호출하고 있습니까? (0) | 2023.01.05 |
Django에서 매일 데이터베이스에 새 테이블을 만드는 방법 (0) | 2023.01.05 |