只能调用一次的函数

时间:2010-09-12 16:46:35

标签: php function

我一直在使用以下方法:

$foo_called = false;

function foo()
{
    if($foo_called)
    {
        return;
    }

    $foo_called = true;

    // do something.
}

我一直想知道是否存在更好/不同的方法。

6 个答案:

答案 0 :(得分:8)

为了清楚代码,我会做这样的事情:

function foo()
{
    static $foo_called = false;
    if (!$foo_called) {
        $foo_called = true;
        // etc.
    }
}

答案 1 :(得分:3)

您可以使用static variable

function foo() {
    static $foo_called = false;
    if ($foo_called) return;

    $foo_called = true;

    // do something.
}

答案 2 :(得分:1)

看看singleton pattern

来自手册“Singleton模式适用于需要单个类实例的情况。最常见的例子是数据库连接。实现此模式允许程序员轻松访问此单个实例许多其他对象。“

答案 3 :(得分:1)

我不能马上想到一个同样简单的人。这很简单可靠。我想你忘记了那里的global,但除此之外它应该运作良好。

答案 4 :(得分:1)

这取决于很多上下文以及您希望仅调用一次函数的原因。

如果您的功能是初始化某些东西或开始某些东西,那么你的方法很好。如果你正在初始化某些东西,你可以做的另一件事是测试你想要初始化的内容是否存在。

function initSomething() {
    if (isSomethingInit()) return;

    // Init Something
}

如果您使用这些函数作为回调函数,则可以使用lambda声明而不是声明函数。这将确保仅从某些地方调用您的函数。

function somethingWithCallback($callback) {
    $callback(5);
}

somethingWithCallback(function ($e) {echo $e;});

答案 5 :(得分:0)

我知道这个问题已经过时了,但我喜欢我的解决方案并想分享它。

$triggered = false;
$trigger = function($callback)use(&$triggered){
    if(!$triggered){
        $callback();
            $triggered = true;
    }
};

foreach(['Hello','World', 'Wuhuu!'] as $value) {
    $value = ' ' . $value;

    $trigger(function()use(&$value){    // will only run once
        $value = trim($value);
    });

    echo $value;
}