我想创建一个函数,如果第一次调用它,它的行为会有所不同,其余时间它的行为会有所不同。现在要做到这一点,我知道我可以使用"状态"变量。这里还给出了其他一些技巧: Check if function has been called yet
但是我不知怎么从同事那里得到一个提示,即debug_backtrace()可以用来解决这个问题。我读过它但不明白怎么回事?此函数提供函数调用的堆栈跟踪。如何判断函数是否第一次被调用?
困扰我的确切代码在这里: http://codepad.org/3vVuEEK4
答案 0 :(得分:2)
我个人不知道这是怎么可能的,或者为什么你想这样做。我怀疑debug_backtrace()
要比static
变量贵很多。
正如您所指出的那样,在调用之间似乎发生变化的唯一回溯特性是行号(从函数调用的位置)。而且,如果你在循环中运行函数,那甚至都不会改变,因为它们都会在每次迭代时从同一行调用。
如果我是你,我会坚持使用状态变量;至于你的同事,如果你对它是如何运作感到好奇(或者我知道我是!),你或许可以让他给你看一个展示他的方法的代码。
编辑(来自评论):基本上,您的同事的debug_backtrace()
方法使用名为的类的键在数组中存储布尔值。
用简单的英语,这是发生的事情:
我知道你在想什么:这没有任何意义,它甚至不存储调用函数的名字!你是对的;这种方法不可扩展,并且开销很大。
如果您想要执行此方法所做的操作,只需在相关类中使用静态变量来跟踪函数是否已被调用。你的同事的方法 - 遗憾地说 - 效率低下且无效。
答案 1 :(得分:0)
采用隐藏的输入字段和
<input type="hidden" id="start_function_count" value="0">
然后调用一个函数
<li onclick="myFunction('start_function_count')">
js函数
MyFunction(count_id) {
var function_count = $("#"+count_id).val();
if(function_count == 0){
// CODE HERE for 1st time function call
// SET HIDDEN FIELD
$("#"+count_id).val(1);
} else{
// SECOnd time code;
}
}
答案 2 :(得分:0)
只需在函数中使用静态字段即可。该静态字段仅初始化一次,不会在新的函数调用上覆盖。
如果在类方法中使用此方法,请确保每个继承的子类都具有其自己的版本。因此,ParentClass
中更新的静态函数字段不会更新ChildClass extends ParentClass
中的静态函数字段。
查看实际情况https://ideone.com/iR7J5O
function beDifferentFirstTime()
{
static $firstTime = true;
if($firstTime) {
$firstTime = false;
echo "I will say this only once, so listen carefully\n";
}
echo "The cabbage is in the cart. I repeat, the cabbage is in the cart.\n";
}
beDifferentFirstTime();
beDifferentFirstTime();