0

如果我有这样的课程:

class MyClass {
    protected function method1() {
      // Method body
    }
}

我可以以某种方式将此方法的主体保存在变量中,以便将其传递给应用程序吗?

例如像这样:

class MyClass {
    function __construct() {
        $var = // body of method1
        $something = new AnotherClass($var);
    }

    protected function method1($arg1, $arg2) {
      // Method body
    }
}


class AnotherClass {
    function __construct($var) {
        $var($this->arg1, $this->arg2);
    }
}

我这样的事情可能吗?

4

2 回答 2

0

您可以尝试使用匿名函数:

$self = $this;
$var = function($arg1, $arg2) use (&$self) {
    $self->method1($arg1, $arg2);
};

如此完整的例子:

class MyClass {
    function __construct() {
        $self = $this;
        $var = function($arg1, $arg2) use (&$self) {
            $self->method1($arg1, $arg2);
        };        
        $something = new AnotherClass($var);
    }

    protected function method1($arg1, $arg2) {
      // Method body
    }
}
于 2013-08-14T13:43:32.120 回答
0

您不能传递body,但可以传递callable对该函数的引用:

...
new AnotherClass(array($this, 'method1'))
...

class AnotherClass {
    function __construct(callable $var) {
        $var($this->arg1, $this->arg2);
    }
}

在这种情况下方法是protected,所以AnotherClass不能直接调用它。然后您可以使用匿名函数:

...
new AnotherClass(function ($arg1, $arg2) { return $this->method1($arg1, $arg2); })
...

callable类型提示和匿名函数仅在$thisPHP 5.4 之后才有效,匿名函数仅在 5.3+ 中可用。对于任何以前的版本,解决方法或多或少都相当复杂。我怀疑这确实是一个多么好的解决方案,其他设计模式在这里可能更合适。

于 2013-08-14T13:45:25.480 回答