programing

PHP의 self::$bar와 static:$bar의 차이점은 무엇입니까?

yoursource 2023. 1. 25. 08:48
반응형

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클래스 멤버를 지칭하는 것은 키워드를 사용하는 클래스를 말합니다.이 경우, 당신의Fooclass는 보호되는 스태틱 속성을 정의합니다.$bar사용할 때self에서Fooclass는 속성을 참조하는 것으로, 같은 클래스를 참조하고 있습니다.

따라서, 만약 당신이 다음을 사용하려고 한다면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::$nameBase 클래스의 경우 확장 시 정적으로 연결된 것이 반환됩니다.를 사용하는 경우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

반응형