在PHP中持有函数的类变量

hac*_*ist 8 php function-pointers class instance-variables

PHP允许变量保存如下函数:

$f = function($a,$b) {
   print "$a $b";
};
$f("Hello","World!"); //prints 'Hello World!'
Run Code Online (Sandbox Code Playgroud)

这对我来说很好.我正在尝试将一个函数传递给一个类并设置一个实例变量来保存该函数,但运气不佳:

class Clusterer {
    private $distanceFunc;
    public function __construct($f) {
        $this->distanceFunc = $f;
        print $f(1,7); //works
        print $this->distanceFunc(1,7); //exceptions and errors abound
    }
}
$func = function($a,$b) {
    return abs($a-$b);
}
$c = new Clusterer($func);
Run Code Online (Sandbox Code Playgroud)

我在这里做错了吗?错误是该函数不存在所以我的猜测是它找到一个具有该名称的类函数(没有一个),然后放弃而不是寻找变量......我怎么能让它查看$ this-> distanceFunc作为变量?

编辑:所以在从下面的答案的建议后,我找到了一个解决方案,它是一个函数来包装调用.例如,我的班级现在是:

class Clusterer {
    private $distanceFunc;
    public function __construct($f) {
        $this->distanceFunc = $f;
        print $f(1,7); //works
        print $this->distanceFunc(1,7); //exceptions and errors abound
    }
    private function distanceFunc($a,$b) {
        $holder = $this->distanceFunc;
        return $holder($a,$b);
    }
}
$func = function($a,$b) {
    return abs($a-$b);
}
$c = new Clusterer($func);
Run Code Online (Sandbox Code Playgroud)

这很有效.Php首先查找函数,只能通过上下文判断它是否是一个变量我猜这是故事的寓意.

Rya*_*yan 1

PHP 没有一流的函数。在 JavaScript 中,如果返回一个函数,则可以执行以下操作:myFunctionThatReturnsAFunction()(1,2),但在 PHP 中不行。

<?php

class Clusterer {

    private $distanceFunc;

    public function __construct(Closure $f) {
        $this->distanceFunc = $f;
    }

    public function getDistFunc()
    {

      return $this->distanceFunc;
    }

}


$func = function($a,$b) {
    return abs($a-$b);
};
$c = new Clusterer($func);

$a = $c->getDistFunc();
echo $a(1,2);
Run Code Online (Sandbox Code Playgroud)