Почему возврат нового static () вызывает утечку памяти?(РНР) - PullRequest
0 голосов
/ 16 сентября 2018

Я пытался сделать тест и посмотреть, как static () и self () отличаются друг от друга в объектно-ориентированном php, поэтому я написал этот простой код:

class Base{
  public function __construct(){
//    return new self();
    return new static();
  }
}

class Sub extends Base {
  public function foo(){
    echo 'yes';
  }
}

$obj = new Sub();
$obj->foo();

Но, как ни странно, ни одно из двух ключевых слов (self / static) в базовом классе, похоже, не работает так, как я ожидаю. Я ожидаю ошибки при использовании self и исправлении этой ошибки с помощью static. Но теперь оба дают ошибку:

Допустимый объем памяти в xxxx байтах исчерпан (попытался выделить xxxx байтов)

Я искал эту ошибку, и она считается результатом "утечки памяти" в программе, но я не могу найти, где я допустил эту утечку.

П.С .: Может быть, я не понимаю себя и статичность должным образом? Я понимаю, что self ссылается на «содержащий класс», а static ссылается на «вызывающий класс».

1 Ответ

0 голосов
/ 16 сентября 2018

Благодаря комментирующим под моим вопросом, я думаю, теперь я могу видеть, где ошибка в этом коде.Я пытался увидеть «позднее статическое связывание» на практике, поэтому я написал этот код, но потом я увидел эту ошибку и подумал, что есть проблема с поздним статическим связыванием в PHP.Как всегда, я был неправ.Дело в том, что, на самом деле, проблема не в поздней статической привязке.Проблема заключается в неправильной структуре наследования в моем коде.

Когда вызывается return new static();, PHP пытается создать экземпляр вызывающего класса (так что поздняя статическая привязка работает нормально), который является классом Sub, ноиз-за наследования и из-за того, что я не переопределил конструктор Base в Sub, PHP будет пытаться вызывать базовый класс снова и снова, и поэтому он превращается в бесконечный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...