Как ссылаться на дочерний класс в унаследованном методе? - PullRequest
2 голосов
/ 27 апреля 2019

Предполагая следующее:

class A
{
    public static function new() 
    {
       return new self();
     }
}

class B extends A
{

}


class C 
{
  public function main() 
 {
   $b = B::new(); // it actually returns a new A -- how to get it to return a new B since B inherited that method?
 }

}

При вызове B::new() он на самом деле возвращает новый A -

Как заставить его вернуть новый B, так как B унаследовал этот метод?

Редактировать: Было обвинение в дублировании вопроса, и мой ответ на него: на самом деле это не дубликат, так как ранее упоминавшийся вопрос касался изменения в языковой структуре, а не этого вопроса о том, как работает наследование. Они очень близки и имеют одинаковый ответ, но это не тот же вопрос. Это как сказать, что 2 * 2 является дубликатом 2 + 2; они имеют одинаковые цифры и в итоге получают одинаковый результат, но задают разные вопросы.

1 Ответ

2 голосов
/ 27 апреля 2019

Заменить new self() на new static() (позднее связывание):

public static function new() 
{
    return new static();
}
...