实践出真知,先动手测试一下。测试demo:
<?php
class A{
public function getSelf()
{
return new self();
}
public function getStatic()
{
return new static();
}
public function getThis()
{
return $this;
}
}
class B extends A {
}
print(get_class((new A())->getSelf())); // A
print(get_class((new A())->getStatic())); // A
print(get_class((new A())->getThis())); // A
echo PHP_EOL;
print(get_class((new B())->getSelf())); // A
print(get_class((new B())->getStatic())); // B
print(get_class((new B())->getThis())); // B
上边的例子可以看出,如果没有子类继承,他们返回的都是当前类的实例的本身。
如果存在了子类继承,那么new self()返回的是父类的实例。new static()仍然返回当前类的实例。
我们把代码做个调整,引入中间类C:
<?php
class A{
public function getSelf()
{
return new self();
}
public function getStatic()
{
return new static();
}
public function getThis()
{
return $this;
}
}
class C extends A{
}
class B extends C {
}
print(get_class((new A())->getSelf())); // A
print(get_class((new A())->getStatic())); // A
print(get_class((new A())->getThis())); // A
echo PHP_EOL;
print(get_class((new C())->getSelf())); // A
print(get_class((new C())->getStatic())); // C
print(get_class((new C())->getThis())); // C
echo PHP_EOL;
print(get_class((new B())->getSelf())); // A
print(get_class((new B())->getStatic())); // B
print(get_class((new B())->getThis())); // B
发现了什么?