2017-04-26 25 views
-1

我正在爲PHP編寫某種代碼分析器,並且正在尋找在框架/腳本中使用「goto」指令的真實示例。PHP中的真實轉換使用

到目前爲止,我只發現了一些marginal usage in Symfony testing suite。 似乎這個語言功能在用戶空間中根本沒有使用?或者它存在於某個地方?

+0

http://stackoverflow.com/questions/46586/goto-still-considered-harmful – Andy

+0

http://adamjonrichardson.com/2012/02/06/long-live-the-goto-statement/ –

+0

是的,我知道。重點不是爭論goto的優點和缺點,而是尋找真正的用例(不是手動/ rfc示例或php測試) –

回答

0

新的答案

最近,我在這所繼承的遺產[定製] PHP部分OO和部分MCV framwork新的僱主開始了工作。在一些頁面上,視圖執行了大量的業務邏輯,而沒有實際顯示任何內容;每一次,這些平的PHP文件被包括在內(而不是include_once()),所以發生的事情是,網站的許多部分是意大利麪條和肉丸類型的腳本(GOTO應該產生的東西被認爲是不好的做法)。

發生了什麼事情是因爲可能需要一行或一行IF語句塊,因此某些邏輯被觸發(因爲它包含多次並在多個位置),並且創建錯誤日誌數百行PHP的整個文件。

創建終點並添加goto END;是一個很好的臨時步驟,可以減少錯誤日誌,避免腳本在不需要時觸發這些位。例如:

if(empty($userRequest)){ 
    goto END; 
} 
## The rest of the script from this point needs to fire until... 

if(empty($_REQUEST['user_id'])){ 
    goto END; 
} 
## etc... 

當然,這只是實際減少意大利麪條的臨時步驟。我還將一些必要的功能移到了控制器類中,這樣做是可行的(並且創建了所謂的視圖文件進行數據建模的模型)。

我可以IF...ELSE語句塊中添加以達到相同的結果,但邏輯的腳本量(和嵌套IF報表等等的量)的意思,在加入goto END;實際上使腳本更具可讀性而其他refatoring正在發生。最終,當我解開了所有的傳統意大利細麪條時,我將刪除GOTO聲明,並使其完全符合MVC和OO。

老答案

下面是使用goto的例子:

<?php 
    ten: 
    print "Hello "; 

    goto ten; 

你是正確的,它幾乎從來沒有在PHP編程中使用,因爲現代的編程觀念認爲,它導致了「麪條代碼」這更難以調試。

但是,請儘量不要在機器級語言中使用非條件循環(實際上是goto)。我記得幾年前使用MIPs彙編的非條件循環。

+1

我需要的是一個真正用在框架/腳本中的實例,而不是手動/ rfc/test示例 –

+0

在非OO腳本中,如果函數不需要參數且不希望返回值,則可以用'name:'替換'function name()'。這與我所能想到的一樣真實。顯然,你必須「休息」,或者其他東西,或者你的腳本的一部分將繼續下一個。 –

+0

我要將我的一些PHP腳本轉換爲使用'GOTO',我會讓你知道我是怎麼做到的。 –