PHP의 self::$bar와 static:$bar의 차이점은 무엇입니까?
를 사용하는 것의 차이점은 무엇입니까?self
그리고.static
다음 예시에서?
class Foo
{
protected static $bar = 1234;
public static function instance()
{
echo self::$bar;
echo "\n";
echo static::$bar;
}
}
Foo::instance();
생산하다
1234
1234
사용할 때self
클래스 멤버를 지칭하는 것은 키워드를 사용하는 클래스를 말합니다.이 경우, 당신의Foo
class는 보호되는 스태틱 속성을 정의합니다.$bar
사용할 때self
에서Foo
class는 속성을 참조하는 것으로, 같은 클래스를 참조하고 있습니다.
따라서, 만약 당신이 다음을 사용하려고 한다면self::$bar
다른 곳에서Foo
수업도 있지만Bar
속성 값이 다른 클래스가 사용됩니다.Foo::$bar
대신Bar::$bar
의도한 바가 아닐 수 있습니다.
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
경유로 메서드를 호출할 때static
레이트 스태틱바인딩(PHP 5.3에서 도입)이라고 불리는 기능을 호출하고 있습니다.
위의 시나리오에서는self
결과적으로Foo::$bar
(1234). 그리고 사용.static
결과적으로Bar::$bar
(4321)는static
, 인터프리터는 에서의 재배열을 고려합니다.Bar
실행 시 클래스
// self
var_dump(Foo::$bar);
// (int) 1234
// static
var_dump(Bar::$bar);
// (int) 4321
일반적으로 메서드나 클래스 자체에 레이트 스태틱바인딩을 사용합니다.이는 서브클래스의 속성을 재클래하지 않는 경우가 많기 때문입니다.static
레이트 바운드컨스트럭터를 호출하기 위한 키워드는 다음 관련 질문에서 찾을 수 있습니다.새로운 셀프와 새로운 스태틱
단, 그렇다고 해서 이 기능을 사용할 수 있는 것은 아닙니다.static
소유물도 있습니다.
이 두 가지 차이점을 보여주는 작은 예가 있습니다.self
그리고.static
.사용.static::
는 Late Static Binding을 실행하여 자 클래스의 변수 값을 바인드합니다.
class A { // Base Class
protected static $name = 'ClassA';
public static function getSelfName() {
return self::$name;
}
public static function getStaticName() {
return static::$name;
}
}
class B extends A {
protected static $name = 'ClassB';
}
echo A::getSelfName(); // ClassA
echo A::getStaticName(); // ClassA
echo B::getSelfName(); // ClassA
echo B::getStaticName(); // ClassB
와 함께self
호출:
class Phone
{
protected static $number = 123;
public function getNumber()
{
return self::$number;
}
}
class Fax extends Phone
{
protected static $number = 234;
}
// Displays: "123"
echo (new Fax)->getNumber();
위에서 볼 수 있습니다.이거는 저희가 오버라이드 했지만$number
저희와 함께Fax
학급,getNumber()
아직 반환되지 않음123
.
이는 PHP에 변수가 정의되어 있는 위치를 알려달라고 요청했기 때문입니다.이 경우 변수가 반환됩니다.Phone
대신 변수입니다.
를 교환하면self
와 통화하다.static
, 우리는 얻을 것이다.Fax
대신 오버라이드된 값:
와 함께static
호출:
class Phone
{
protected static $number = 123;
public function getNumber()
{
// return self::$number;
return static::$number;
}
}
class Fax extends Phone
{
protected static $number = 234;
}
// Displays: "234"
echo (new Fax)->getNumber();
언급한 바와 같이 주요 차이점 중 하나는 이다.static
는 레이트 스태틱바인딩을 허용합니다.발견된 가장 유용한 시나리오 중 하나는 싱글톤 클래스의 기본 클래스를 만드는 것입니다.
class A { // Base Class
protected static $name = '';
protected static function getName() {
return static::$name;
}
}
class B extends A {
protected static $name = 'MyCustomNameB';
}
class C extends A {
protected static $name = 'MyCustomNameC';
}
echo B::getName(); // MyCustomNameB
echo C::getName(); // MyCustomNameC
사용.return static::$name
Base 클래스의 경우 확장 시 정적으로 연결된 것이 반환됩니다.를 사용하는 경우return self::$name
그리고나서B::getName()
는 Base 클래스에서 선언된 빈 문자열을 반환합니다.
이 자체 설명이 도움이 될 수 있습니다.
class Foo { protected static $bar = 'parent value'; public static function test() { var_dump('I am your father'); var_dump('self:: here means '.self::$bar); var_dump('static:: here means '.static::$bar); } } class Bar extends Foo { protected static $bar = 'child value'; public static function test() { parent::Test(); var_dump('I am the child'); var_dump('self:: here means '.self::$bar); var_dump('static:: here means '.static::$bar); } } Bar::test(); Foo::test();
이것에 의해, 다음의 출력이 생성됩니다(명확하게 하기 위해서 회선 끊기를 추가했습니다).
'I am your father' (length=16)
'self:: here means parent value' (length=30)
'static:: here means child value' (length=31)
'I am the child' (length=14)
'self:: here means child value' (length=29)
'static:: here means child value' (length=31)
'I am your father' (length=16)
'self:: here means parent value' (length=30)
'static:: here means parent value' (length=32)
언급URL : https://stackoverflow.com/questions/11710099/what-is-the-difference-between-selfbar-and-staticbar-in-php
'programing' 카테고리의 다른 글
MariaDB - 청구서 번호 - 매년 0으로 돌아가기 (0) | 2023.01.25 |
---|---|
왜 PHP에서 sprintf 함수를 사용하는가? (0) | 2023.01.25 |
python->SQ에서 mysql(MariaDB)에 대한 접속이 실패함cmd에 성공하는 동안 LALchemy (0) | 2023.01.25 |
스핑크스의 자동화가 불충분하다 (0) | 2023.01.15 |
Android 응용 프로그램의 QR 코드를 생성하는 방법은 무엇입니까? (0) | 2023.01.15 |