通过类中的引用传递函数

时间:2013-06-21 11:03:56

标签: php class oop pointers reference

我试图通过引用该函数的另一个函数来传递一个函数(来自同一个类),但它似乎不起作用。我可以在课外进行,但不能在课堂上进行:有没有办法正确地做到这一点?

class test {
  function test() {
    $this->check(1==2, &$this->t(), &$this->f()); 
  }

  function check($statement, $true, &$false) {
    if(eval($statement)) {
      $true;
    }
    $false;
  }

  function t() {
    print "true";
    return true;
  }

  function f() {
    print "false";
    return false;
  }
}

1 个答案:

答案 0 :(得分:1)

不推荐在呼叫时通过引用传递(实际上从5.4开始删除):

  

从PHP 5.3.0开始,您将收到一条警告,说明"通话时间通过参考"使用&时已弃用在foo(& $ a);.从PHP 5.4.0开始,删除了调用时传递引用,因此使用它会引发致命错误。

From php's docs
传递对布尔值的引用也没有实际意义。理论上,PHP引用占用的内存与C指针(4字节)相同,布尔值可能是(短)int,只需要2个字节。如果有的话,我说你会产生更多的开销。

如果您通过引用另一个函数/方法传递对象或数组,则必须相应地定义函数:

function doStuff_byRef(array &$arg)
{
    $arg[] = 'add new stuff';
}

通过引用传递函数,就像你在JS中所做的那样,在PHP中是不可能的。但是,您可以定义函数 not 以返回值,但返回对其返回值的引用:

public function &getPropertyRef()
{
    return $this->property;
}

但是,在您的情况下,我只是这样做:

$this->check(1==2, 't', 'f');//pass method names
private function check($stmt, $func1, $func2)
{
    //don't use eval, btw
    if ($stmt)
    {
        return $this->{$func1}();
    }
    return $this->{$func2}();
}

或者,更灵活:

$this->check(1==2, array($this, 't'), array($this, 'f'));//pass method names
private function check($stmt, array $func1, array $func2)
{
    //don't use eval, btw
    if ($stmt)
    {
        return call_user_func_array($func1);
    }
    return call_user_func_array($func2);
}

我想,如果你有PHP> = 5.3,你可以使用一个闭包实例:

private function check($stmt, Closure &$func1, Closure &$func2)
{
    return $stmt ? $func1() : $func2();
}

然后,你可以这样做:

$functionReference = function()
{
    echo 'true';
    return true;
};
$functionRef2 = function()
{
    echo 'false';
    return false;
};
$this->check(true, $functionReference, $functionRef2);

但是这会增加更多的开销:PHP闭包只是添加到语言中的一种,不应该在那里。它在编译时创建Closure类的实例,然后该对象通过引用传递。老实说,最好的方法是我的第一个建议,仍然是,恕我直言($this->{$func1}();