Почемеу вызов наследуемого класса с обращением к абстрактному методу приводитк к ошибке памяти?

<?php

	abstract class R{

		abstract function r();

	}

	final class A extends R{
		public function r(){
			echo "a";
		}
		public function a()
		{
			return $this->r();
		}
	}

	class B extends R{

		public function r(){
			echo "b";
		}
		public function b()
		{
			return $this->r();
		}
	}

	class C extends R{
		public function r(){
			echo "c";
		}
		public function c()
		{
			return $this->r();
		}
	}

	class D extends B{
		public function r(){
			return $this->b();
		}
	}

$a = new A();
$b = new B();
$b = new C();
$b = new D();


Сама ошибка:
Allowed memory size of 1610612736 bytes exhausted (tried to allocate 262144 bytes)

Да я могу пробовать решить это через php.ini, но конкретно в данном примере я хочу понять как образуется такая нагрузка. Наверно...
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
@MadridianFox
Web-программист, многостаночник
Потому что рекурсия получается. Класс D в методе r() вызывает свой метод b() который унаследован от класса B и который в свою очередь вызывает метод r() и так по кругу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Не делайте так. Если имя метода совпадает с названием класса, то этот метод вызывается в качестве конструктора. Но это deprecated, и с седьмой версии уже выдает предупреждения. Лучше переписать с использованием __construct().
Ответ написан
Immortal_pony
@Immortal_pony Куратор тега PHP
Методы, которые имеют то же название, вызываются автоматически (как конструктор). Однако на это поведение крайне не рекомендуется опираться, так как оно deprecated в текущей версии PHP и не будет работать в следующей.
Подозреваю, что у вас где-то образовалась "петля" - то есть метод одного из классов вызывает метод другого класса, котрый вызывает все тот же метод.

function forLoopFirst() {
    return forLoopSecond();
}

function forLoopSecond() {
    return forLoopFirst();
}

forLoopFirst()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы