class Foo
{
public static function baz() {
return new self();
}
}
$x = Foo::baz(); // $x is now a `Foo`
Вы получаете Foo, даже если статический определитель, который вы использовали, был для производного класса:
class Bar extends Foo
{
}
$z = Bar::baz(); // $z is now a `Foo`
Если вы хотите включить полиморфизм (в некотором смысле), и PHP обратит внимание на используемый вами классификатор, вы можете поменять ключевое слово self для ключевого слова static:
class Foo
{
public static function baz() {
return new static();
}
}
class Bar extends Foo
{
}
$wow = Bar::baz(); // $wow is now a `Bar`, even though `baz()` is in base `Foo`
Это стало возможным благодаря функции PHP, известной как поздняя статическая привязка; не путайте его для других, более обычных применений ключевого слова static.