2013-07-14 80 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

相關問題