Просто оберните имя свойства в круглые скобки.
echo ($cl->sum)(33, 33);
echo ($custom->sum)(44, 44);
Пример из 3v4l:
https://3v4l.org/3ZqNV
Редактировать на основе комментариев:
Объект в Javascript может иметь только свойства.Это могут быть примитивные значения, другие объекты или функции, но имя свойства уникально, несмотря на его содержимое.
В PHP объект может иметь как свойства, так и метод.
Предположим, чтоу нас есть следующий код:
class MyClass
{
public $foo;
public function __construct()
{
$this->foo = function(int $a, int $b): int {
return $a * $b;
};
}
public function foo(int $a, int $b): int
{
return $a + $b;
}
}
$myClass = new MyClass();
echo $myClass->foo(2, 3);
Оба свойства foo
и метод foo
имеют одинаковую сигнатуру, но какова была воля программиста?
Этот код вызовет метод foo
и печатает 5, поэтому любая строка $var->name()
интерпретируется как вызов метода.
Если вы хотите вызвать замыкание внутри свойства, вы должны использовать другой синтаксис, чтобы не было двусмысленности.
echo ($myClass->foo)(2, 3) //Prints 6
https://3v4l.org/PXiMQ