我正在转换PHP 5.3库以使用PHP 5.2。阻碍我的方法是使用像return new static($options);
这样的后期静态绑定,如果我将其转换为return new self($options)
,我会得到相同的结果吗?
new self
和new static
之间的区别是什么?
答案 0 :(得分:803)
我会得到相同的结果吗?
不是真的。不过,我不知道PHP 5.2的解决方法。
new self
和new static
之间的区别是什么?
self
指的是实际编写new
关键字的同一个类。
static
,在PHP 5.3的后期静态绑定中,指的是您调用方法的层次结构中的任何类。
在以下示例中,B
继承了A
中的两种方法。 self
调用绑定到A
,因为它在A
的第一个方法的实现中定义,而static
绑定到被调用的类(也见{{3} }})。
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
答案 1 :(得分:18)
如果此代码的方法不是静态的,您可以使用get_class($this)
在5.2中解决此问题。
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"
答案 2 :(得分:5)
除了其他人的答案:
static ::将使用运行时信息进行计算。
这意味着您不能在类属性中使用lapply
,因为属性值:
必须能够在编译时进行评估,并且不得依赖于运行时信息。
static::
使用class Foo {
public $name = static::class;
}
$Foo = new Foo;
echo $Foo->name; // Fatal error
self::