Answers:
我会得到相同的结果吗?
并不是的。不过,我不知道针对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
会返回一些无法覆盖的内容……但是,瞧,这是相反的。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 行引发的,如示例所示。该错误显示:“ static :: class无法用于编译时类名称解析”,这表明问题不在您尝试访问$ name字段的位置,而是在PHP类的编译之前。在第一个示例中,不会达到第7行(或第6行)。