我一直在使用以下方法:
$foo_called = false;
function foo()
{
if($foo_called)
{
return;
}
$foo_called = true;
// do something.
}
我一直想知道是否存在更好/不同的方法。
答案 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模式适用于需要单个类实例的情况。最常见的例子是数据库连接。实现此模式允许程序员轻松访问此单个实例许多其他对象。“
答案 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;
}