最近在閱讀PHP相關(guān)的書籍或者文章的時(shí)候,你是否遇到過類似這樣的代碼:
function doSomething() { // some code here if ($error) { goto handleError; } // some more code here handleError: // handle error here }
如上代碼所示,這是PHP中常用的goto語句,它可以在代碼中定位到特定的標(biāo)簽處,進(jìn)而改變代碼的執(zhí)行流程。
然而,goto語句一直以來都是一個(gè)有爭(zhēng)議的話題,很多人認(rèn)為它會(huì)導(dǎo)致程序混亂,增加代碼難度和維護(hù)成本。它并不受歡迎,甚至在某些編程語言中被禁用了。
我們來看一個(gè)例子,假設(shè)我們要找一組數(shù)字中最大的奇數(shù):
function findMax($arr) { $max = null; foreach ($arr as $value) { if ($value % 2 == 1) { if (!$max || $value >$max) { $max = $value; } } } return $max; }
可以看到,這是非常常見的代碼,也非常易于閱讀和理解。但是如果我們使用goto語句來重寫代碼,就會(huì)變得非常復(fù)雜:
function findMax($arr) { $max = null; foreach ($arr as $value) { if ($value % 2 == 0) { goto not_odd; } if (!$max || $value >$max) { $max = $value; } not_odd: } return $max; }
如上所示,如果有人喜歡使用goto,那么這個(gè)代碼就會(huì)出現(xiàn)在你的面前。它非常難以閱讀和考慮,并且很難對(duì)其進(jìn)行維護(hù)和改進(jìn)。
許多編程語言不鼓勵(lì)或禁止使用goto語句的一個(gè)原因是,它們會(huì)導(dǎo)致“代碼的執(zhí)行流程不清晰”。而且隨著代碼量的增加,使用goto的問題會(huì)變得越來越嚴(yán)重。使用goto語句只需要短短一行代碼,但是它卻會(huì)造成程序難以理解和維護(hù)的后果。
在 PHP 7 中,PHP 引入了一個(gè)新的控制結(jié)構(gòu)「Continue N」(當(dāng)前的 N 只能為 1),它可以讓我們保持代碼執(zhí)行的清晰性和可讀性。與舊的goto語句不同,控制結(jié)構(gòu)“Continue N”只是讓我們直接繼續(xù)執(zhí)行代碼,而不會(huì)改變程序的正常執(zhí)行順序。
舉個(gè)例子:
function findMax($arr) { $max = null; foreach ($arr as $value) { if ($value % 2 == 0) { continue; } if (!$max || $value >$max) { $max = $value; } } return $max; }
可以看到,現(xiàn)在的代碼易于閱讀和理解,程序的執(zhí)行順序清晰,可以輕松維護(hù)和改進(jìn)。PHP 7 釋放了此功能的力量,讓我們能夠編寫清晰、易于閱讀、易于理解的代碼。
總結(jié)來說,goto語句是一個(gè)有爭(zhēng)議的話題,使用它可能會(huì)導(dǎo)致程序混亂和復(fù)雜,增加代碼難度和維護(hù)成本。但是,如果我們使用PHP 7中引入的控制結(jié)構(gòu)“Continue N”,就可以讓代碼執(zhí)行保持清晰和可讀性,這也是PHP 7重要的改進(jìn)之一。