답변:
같은 결과를 얻을 수 있습니까?
실제로는 아닙니다. 그래도 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
get_called_class()
. 이는 __CLASS__
사실상와 동일 하지만 LSB와 호환됩니다.
self
하고 스스로를 static
반환하고 재정의 할 수없는 것을 반환 할 것입니다 ...하지만 lo는 반대입니다. PHP의 이름, 규칙 및 전체적인 스타일에 감명을받지 않습니다. -_-
이 코드의 메서드가 정적이 아닌 경우을 사용하여 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"
clone
있지만 속성을 다시 만들고 설정하기 만하면됩니다. $copy = new static(); $copy->set($this->get()); return $copy;
self::
또는 static::
영향을받습니다. 그러한 상황이 본질적으로 나쁜 습관을 나타내는 것이라고 생각할 어떤 이유가 없다면 (그리고 이것이 왜 그렇게 해야하는지 아무 이유도 보지 못합니다), 비 정적 방법과 그 사이의 선택 self::
과 그 사이의 선택 static::
정적 메소드. 나는 당신의 의견을 잘못 이해 했습니까, 아니면 우리가 단순히 틀린 것입니까?
다른 사람의 답변 외에도 :
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으로 객체가 인스턴스화되기 전에 오류가 발생했습니다.
public $name = static::class;
예제에서 제안한대로 오류는 7 행이 아닌 2 행에 발생합니다 . 오류 : "정적 :: 클래스를 컴파일 타임 클래스 이름 확인에 사용할 수 없습니다"는 문제가 $ name 필드에 액세스하려고하지 않고 PHP 클래스를 컴파일 할 때 훨씬 이전에 있음을 나타냅니다. 첫 번째 예에서는 7 행 (또는 6 행)에 도달하지 않습니다.