Mik*_*ike 483 php static late-static-binding
我正在转换PHP 5.3库以在PHP 5.2上工作.支持我的主要方法是使用后期静态绑定return new static($options);,如果我将其转换为return new self($options)将得到相同的结果?
new self和之间有什么区别new static?
Bol*_*ock 840
我会得到相同的结果吗?
并不是的.不过,我不知道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
Run Code Online (Sandbox Code Playgroud)
Mar*_*tis 20
如果此代码的方法不是静态的,您可以通过使用在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()));
Run Code Online (Sandbox Code Playgroud)
结果:
string(1) "B"
string(1) "B"
Run Code Online (Sandbox Code Playgroud)
除了其他人的答案:
static ::将使用运行时信息进行计算。
这意味着您不能static::在类属性中使用,因为属性值:
必须能够在编译时进行评估,并且不能依赖于运行时信息。
class Foo {
public $name = static::class;
}
$Foo = new Foo;
echo $Foo->name; // Fatal error
Run Code Online (Sandbox Code Playgroud)
使用 self::
class Foo {
public $name = self::class;
}
$Foo = new Foo;
echo $Foo->name; // Foo
Run Code Online (Sandbox Code Playgroud)