2013-07-14 52 views
1

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

但是我以某种方式得到了一个同事的提示,即debug_backtrace()可以用来解决这个问题。我读过它,但不明白如何?该函数给出函数调用的堆栈跟踪。如何判断函数是否被第一次调用?

,导流我确切的代码是在这里: http://codepad.org/3vVuEEK4

+0

您是否尝试过两次运行函数并比较debug_backtrace的输出? –

+0

是的。输出仅在数组[0] ['Line']中有所不同,即只有行号改变......我猜想这是正确的,因为堆栈跟踪没有改变。它仍然使用相同的规则和路径调用相同的函数。 – Rash

回答

2

我个人看不出这是可能的,或者你为什么会想要做这种方式。首先,我怀疑debug_backtrace()比变量static贵很多。

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

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

编辑(从注释):基本上,同事的debug_backtrace()方法存储在使用被称为类的键阵列的布尔值。

用简单的英语,这里发生了什么:

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

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

如果你想要做这个方法所做的事情,只需在有问题的类中使用一个静态变量来跟踪函数是否被调用。您的同事的方法—对不起,说—是低效率和无效。

+0

这是他给我的: http://codepad.org/3vVuEEK4 – Rash

+0

@ user1834562啊,好的。我已经更新了我的帖子,并提供了一些相关信息。我真的很难理解为什么你分享的功能对任何人都有用。 – Eric

+0

我的问题是,当他检查函数名称=“JS”时,该行如何判断此函数是否曾被调用过。它只是告诉“JS”函数从某处被调用。 – Rash

相关问题