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
?
self
new
키워드가 실제로 작성된 것과 동일한 클래스를 나타냅니다 .
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으로 객체가 인스턴스화되기 전에 오류가 발생했습니다.