И чего странного тут? "nnn" - это поле, а не метод. Следовательно надо получить значение поля и уже его вызвать:
class Some
{
public function __construct(
public \Closure $fun
) {
$this->fun = fn () => print 'property';
}
public function fun()
{
echo 'method';
}
}
// Метод
$some->fun();
// Поле
$fun = $some->fun;
$fun();
// Или
($some->fun)();
galaxy, Кто-то походу не умеет в формальную грамматику ЯП?)))
Предлагаю написать не EBNF, а хотя бы синтаксис, который бы позволил вызвать функцию из поля без дополнительных круглых скобок. За основу можно взять мой класс, который я написал выше.
Когда поймёте, что лучше не получается, тогда и осознаете насколько глупы ваши претензии к тому, к чему претензий вообще быть не может, ибо это часть синтаксиса идеально согласована.
Кирилл Несмеянов, не приписывайте мне свои фантазии. Я прекрасно без вас понимаю, зачем нужны скобки.
Я вам уже указал, что такое поведение языка не четко и не понятно. То, что у PHP свойства и методы суть разные сущности, из-за чего они могут называться одинаково, - это проблемы его темного прошлого. Для языка, где функции - first class object, в 2021 году это ни разу не логичное поведение.
galaxy, не, ну с такими аргументами я склонен согласиться. С другой стороны - это, пусть и искусственное, но разграничение, упрощает понимание. И помимо этого повышает удобство метапрограммирования за счёт различий между __get/__call, в отличие от Ruby или JS (у которых подобных разграничений нет), где за счёт Proxy у второго - реализовать какой-нибудь High Order Messaging можно лишь через жопу, просто потому что отличить вызов от получения поля не представляется возможным стандартными средствами без вывертов.
Короче, да, эта шляпа с разграничениями выглядит как легаси, да и не красиво получается. Но на практике оно удобнее и эффективнее.