public function __call($method, $arguments)
эта конструкция вызывается только тогда, когда $method не был явно определен у класса.
class App extends BaseClass
{
function hello()
{
echo "hello world";
}
}
здесь вы явно определили функцию. Можете проверить это, добавив здесь:
public function __call($method, $arguments)
{
echo "------"; // kak-to tak
if (isset($this->{$method}) /*&& is_callable($this->{$method})*/) {
return $this->{$method}($arguments);
} else {
throw new Exception("Fatal error: Call to undefined method BaseClass::{$method}()");
}
}
какой-либо вывод. Вы заметите что он не выполнится вообще.
В случае же с замыканием вы вызываете функцию $app2->hello(); но её не находит явно. Потом вы снова вызываете функцию
уже в теле метода __call: $this->{$method}($arguments); и её снова не находит явно. Таким образом создается бесконечный вызов __call.
А все потому что property и method - разные вещи. И пусть у класса есть свойство с именем hello, но у него нет метода с именем hello - как следствие, вы обречены на зацикливание.