[php] 새로운 자기 대 새로운 정적

PHP 5.2에서 작동하도록 PHP 5.3 라이브러리를 변환하고 있습니다. 내 방식으로 서있는 가장 중요한 것은 같은 정적 바인딩을 사용 return new static($options);하는 return new self($options)것입니다. 이를 변환 하면 동일한 결과를 얻을 수 있습니까?

차이점은 무엇이며 new self그리고 new static?



답변

같은 결과를 얻을 수 있습니까?

실제로는 아닙니다. 그래도 PHP 5.2의 해결 방법을 모르겠습니다.

차이점은 무엇이며 new self그리고 new static?

selfnew키워드가 실제로 작성된 것과 동일한 클래스를 나타냅니다 .

static, PHP 5.3의 늦은 정적 바인딩에서 계층 구조에서 메소드를 호출 한 클래스를 가리 킵니다.

다음 예제에서는에서 B두 메소드를 모두 상속합니다 A. self호출이 바인딩 A이 정의 있기 때문에 A반면, 첫 번째 방법의의 구현을 static호출 클래스에 바인드됩니다 (참조 get_called_class()).

class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A


답변

이 코드의 메서드가 정적이 아닌 경우을 사용하여 5.2에서 해결 방법을 얻을 수 있습니다 get_class($this).

class A {
    public function create1() {
        $class = get_class($this);
        return new $class();
    }
    public function create2() {
        return new static();
    }
}

class B extends A {

}

$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));

결과 :

string(1) "B"
string(1) "B"


답변

다른 사람의 답변 외에도 :

static ::은 런타임 정보를 사용하여 계산됩니다.

static::속성 값 때문에 클래스 속성에서 사용할 수 없습니다 .

컴파일 타임에 평가할 수 있어야하며 런타임 정보에 의존해서는 안됩니다.

class Foo {
    public $name = static::class;

}

$Foo = new Foo;
echo $Foo->name; // Fatal error

사용 self::

class Foo {
    public $name = self::class;

}
$Foo = new Foo;
echo $Foo->name; // Foo

내가 작성한 코드의 치명적 오류 주석은 오류가 발생한 위치를 나타내지 않으며, 주석에서 언급 된 @Grapestain으로 객체가 인스턴스화되기 전에 오류가 발생했습니다.


답변