如何知道函数是否第一次被调用

时间:2013-07-14 02:49:42

标签: php

我想创建一个函数,如果第一次调用它,它的行为会有所不同,其余时间它的行为会有所不同。现在要做到这一点,我知道我可以使用"状态"变量。这里还给出了其他一些技巧: Check if function has been called yet

但是我不知怎么从同事那里得到一个提示,即debug_backtrace()可以用来解决这个问题。我读过它但不明白怎么回事?此函数提供函数调用的堆栈跟踪。如何判断函数是否第一次被调用?

困扰我的确切代码在这里: http://codepad.org/3vVuEEK4

3 个答案:

答案 0 :(得分:2)

我个人不知道这是怎么可能的,或者为什么你想这样做。我怀疑debug_backtrace()要比static变量贵很多。

正如您所指出的那样,在调用之间似乎发生变化的唯一回溯特性是行号(从函数调用的位置)。而且,如果你在循环中运行函数,那甚至都不会改变,因为它们都会在每次迭代时从同一行调用。

如果我是你,我会坚持使用状态变量;至于你的同事,如果你对它是如何运作感到好奇(或者我知道我是!),你或许可以让他给你看一个展示他的方法的代码。

编辑(来自评论):基本上,您的同事的debug_backtrace()方法使用名为的类的键在数组中存储布尔值。

用简单的英语,这是发生的事情:

  • 调用函数是否叫“JS”?
  • 如果是这样,存储在JS标记的数组中;否则,请使用带CSS标签的数组。
  • 检查是否指定了类;如果不是,请使用此课程。
  • 如果标签数组中的给定类有一个布尔值,那么这不是第一次。
  • 否则,将给定类的布尔值设置为true。

我知道你在想什么:这没有任何意义,它甚至不存储调用函数的名字!你是对的;这种方法不可扩展,并且开销很大。

如果您想要执行此方法所做的操作,只需在相关类中使用静态变量来跟踪函数是否已被调用。你的同事的方法 - 遗憾地说 - 效率低下且无效。

答案 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();