在PHP中的变量中存储类函数的引用

时间:2015-02-19 00:38:26

标签: php

这是一个假设的示例(父类PageState,包含类FooterState的实例 - 可能无法创建实例,具体取决于条件。FooterState需要调用一个公共的函数,并在PageState类中创建:

class PageState {
    private $footer_state = null;

    function PageState() {
        $this->footer_state= new FooterState($this);
    }

    public function getExpectedPageDimensions() {
        // do calculations based on existing body content
        return $dimensions;
    }
}

class FooterState {
    private $get_dimensions_func = null;

    function FooterState($page_state) {
        // Here, we need to get the reference to the function from the $page_state class
        $this->get_dimensions_func = $page_state->getExpectedPageDimensions;
    }

    public function addLogos($logo_data) {
        $page_dimensions = $this->get_dimensions_func();
        // use the page dimensions to decide on the size of the content
        return Array('width' => $width, 'height' => $height);
}

我知道其他解决方案:

  • 不是复制对函数的引用,而是创建对类$this->page_state = $page_state;的引用,然后FooterState中的函数可以调用$this->page_state->getExpectedPageDimensions();
  • 使用global $PageStateInstance;,然后只需致电$PageStateInstance->getExpectedPageDimensions();

但我想知道是否可以在变量中存储对类函数的引用。如果函数在类之外,则可以执行$func = 'getExpectedPageDimensions'; $func();之类的内容。

3 个答案:

答案 0 :(得分:2)

您可以将实例和函数作为可调用传递:具有实例和函数名称的数组。有一个类似的系统用于调用静态类方法。

# An example callback method
class MyClass {
    function myCallbackMethod() {
        echo 'Hello World!';
    }
}

# create an instance
$obj = new MyClass();
# and later:
call_user_func(array($obj, 'myCallbackMethod'));

来自此处的文档:http://php.net/manual/en/language.types.callable.php

答案 1 :(得分:1)

  

不要复制对函数的引用,而是创建对类$ this-> page_state = $ page_state的引用;然后FooterState中的函数可以调用$ this-> page_state-> getExpectedPageDimensions();

这是最好的通用解决方案。

  

但我想知道是否可以在变量中存储对类函数的引用。

是的,但它确实只适用于静态函数,除非您实例化该类。例如:

class A {
    public static function doSomethingStatic() {
        // ...
    }
    public function doSomethingElse() {
        // ...
    }
}

$somevar = 'A::doSomethingStatic';
$result = call_user_func($somevar); // calls A::doSomethingStatic();

$myA = new A();
$myref = array($myA, 'doSomethingElse');
$result = call_user_func($myref); // calls $myref->doSomethingElse();

请注意,在第二个示例中,您必须实例化该类并将数组作为第一个参数传递给call_user_func()

参考文献:http://php.net/manual/en/function.call-user-func.phphttp://php.net/manual/en/language.types.callable.php

答案 2 :(得分:0)

  

可以存储对类函数的引用

我认为你的意思是 object 而不是 class ,但是你可以使用闭包。

我认为你不需要。 $this->page_state似乎可以正常工作。

不要使用全局变量。