通过引用传递函数

时间:2014-05-20 14:16:49

标签: php variables reference

是否可以通过引用传递函数?因此,每次调用引用变量时,都会调用该函数。看看我的代码。

<?php
class Documents {
    private static $docs = array(
        'She went to the toilet and on her way back, opened the wrong door',
        'She had found something that would mean she\'d never be poor again - but there was a catch',
        'It was just for one night',
        'He watched, helpless, as the door closed behind her'
    );


    public static function get() {
        return self::$docs[array_rand(self::$docs)];
    }
}

class Printer {
    public static $content;
}

Printer::$content = &Documents::get();

echo        Printer::$content;
echo "\n" . Printer::$content;
echo "\n" . Printer::$content;

现在它会打印3条相似的行,但我希望每次打印Documents::get()时都会打Printer::$content,因为Printer::$content = **&**Documents::get();是参考。

3 个答案:

答案 0 :(得分:3)

不,你不能拥有一个你视为变量的变量,尽管如此,它仍然在幕后运行代码。如果你写$foo,那就是使用变量的值。只有你写$foo()才明确执行一个函数。

话虽如此,在某些情况下会隐式调用对象方法。例如,如果$foo是一个对象,并且您在字符串上下文中使用它:

echo $foo;

这将(尝试)隐式调用$foo->__toString()

请不要以某种方式滥用这个隐含的方法调用来做任何花哨的事情。如果要调用函数,请调用函数。您甚至可以从其他函数返回函数,因此不乏传递函数的可能性。但是,您必须使用()明确地调用它们。

答案 1 :(得分:0)

有变量函数:

php > function foo($bar) { echo $bar; }
php > $baz = 'foo';
php > $baz('qux');
qux

但你不能让PHP自动执行那个&#34;引用&#34;简单地访问变量时的函数,例如:

php > $baz;
php >

如您所见,未调用foo函数,并且未执行任何输出。没有()来表示函数调用,该变量就像任何其他变量一样 - 它只是一个字符串,其内容恰好与特定函数相同。它是()使字符串&#34;可执行的&#34;。

请注意,应该避免使用变量函数,虽然它们在某些有限的情况下很有用,因为它们可能导致意大利面条代码和难以调试的错误。

答案 2 :(得分:0)

您可以使用魔术方法__get()

class Printer {
    public function __get($name)
    {
        switch($name) {
            case "content":
                return Documents::get();
                break;
            default:
                return $this->$name;
                break;
        }
    }
}

但这不能在静态环境中完成。所以你必须有一个打印机实例。 (也许使用单身?)