我正在将 PHP 5.3 库转换为在 PHP 5.2 上工作。阻碍我的主要事情是使用后期静态绑定return new static($options);
,如果我将其转换为,return new self($options)
我会得到相同的结果吗?
new self
和 和有什么不一样new static
?
我正在将 PHP 5.3 库转换为在 PHP 5.2 上工作。阻碍我的主要事情是使用后期静态绑定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 之前