首頁  >  文章  >  後端開發  >  流程控制 - PHP手冊筆記

流程控制 - PHP手冊筆記

WBOY
WBOY原創
2016-08-08 09:29:151020瀏覽

腳本由語句構成,語句靠流程控制實現功能,這一節主要介紹了幾個關鍵字的使用。

elseif

elseifelse if的行為完全一樣,如果用冒號來定義if/elseif條件,那就不能用兩個單字的else if,否則PHP會產生解析錯誤。

<code><?php 
$a = 1;
$b = 2;
if($a > $b) :
	echo "$a is greater than $b";
elseif($a == $b) :
	echo "$a equals $b";
else :
	echo "$a is neither greater than or equal to $b";
endif;</code>

替代語法

下面的這些關鍵字可以使用流程控制的替代語法,基本形式是把左花括號換成冒號,右花括號換成下面的字元。

<code>if - endif
while - endwhile
for - endfor
foreach - endforeach
switch - endswitch</code>

注意! PHP不支援在同一控制區塊內混合使用兩種語法。

do-while

這個循環乍看之下挺熟悉的,但是卻忽略了它的某些用法。

手冊中說,資深的C語言使用者可能熟悉另一種不同的do-while循環用法,把語句放在do-while(0)之中。我竟然第一次聽到有這種技巧,看來我還是C語言小白。

順便搜尋整理一下do-while(0)這種特殊用法的好處吧。

  1. 程式碼分塊,比僅僅使用花括號更直觀。
  2. 使用break跳過剩餘的一段程式碼。
  3. 有利於巨集定義函數,使用時句尾可以加分號,看起來更像函數呼叫。
  4. 塊級作用域,避免變數名稱擴散到上層作用域。
  5. 變形的goto語句。

這個帖子講的挺好的,do{}while(0) 的作用 - c++ - SegmentFault。

foreach

foreach僅能夠應用於陣列和物件的遍歷。 foreach語法結構提供了遍歷數組的簡單方式,有以下兩種語法。

<code>foreach(array_expression as $value)
	statement
foreach(array_expression as $key => $value)
	statement</code>

要修改數組元素的值需要使用引用賦值,透過在$value前加上&實現。

<code><?php 
$arr = array(1, 2, 3, 4);
foreach($arr as &$value) {
	$value = $value * 2;
}
unset($value);
foreach($arr as $value) {
	echo "$value ";  // 2 4 6 8
}</code>

注意!數組最後一個元素的$value引用在foreach循環之後仍會保留,建議使用unset()將其銷毀。

list-each

在範例程式中,也發現了一種特殊的遍歷方法,姑且稱作list-each

foreach開始執行時,陣列內部的指標會自動指向第一個單元,因此不需要在foreach迴圈之前呼叫reset()。但是對於while中的list-each,數組內部指針$arr會一直存在著,因此在下次循環前需要reset($arr)

<code><?php 
$arr = array('one', 'two', 'three');
// reset($arr);
while(list($key, $value) = each($arr)) {
	echo "Key: $key; Value: $value ";
}
reset($arr);
while(list($key, $value) = each($arr)) {
	echo "Key: $key; Value: $value ";
}</code>

在上面這段程式碼中,第一個reset可以省略,但第二個reset不能省。

list

PHP 5.5增添了遍歷一個陣列的陣列的功能,並且把嵌套的陣列解包到循環變數中。

<code><?php 
$array = [
	[1, 2],
	[3, 4],
];
foreach($array as list($a, $b)) {
	echo "A: $a; B: $b";
}</code>

list()中的單元可以少於嵌套數組的,此時多出來的數組單元將被忽略。若多於,將發出錯誤訊息。

break

break用來結束目前for/foreach/while/do-while/switch結構的執行。 break可以接受一個可選的數字參數來決定跳出幾重循環,但參數不能為變數。

break跳出多重循環還是第一次遇到,特意寫了個小程式嘗試了一下。

<code><?php 
while(1) {
	while(1) {
		echo 'hello ';
		break 2;
	}
}
echo 'world';</code>

特地在C語言裡嘗試了一下,提示語法錯誤。

continue

break相似,continue也可以接受一個可選的數字參數來決定跳過幾重循環到循環結尾。

注意!在PHP中switch語句被認為是可以使用continue的一種循環結構。

switch

手冊中說,PHP和其它語言不同,continue語句作用到switch上的作用類似於break。這是什麼意思呢?

switch/case做的是鬆散比較==,而不是嚴格比較===。效率方面,switch語句中條件只求值一次並用來和每個case語句比較。 case表達式可以是任何求值為簡單類型的表達式,不能用陣列或物件。允許使用分號代替case語句後的冒號。

declare

declare結構用來設定一段程式碼的執行指令,語法結構如下:

<code>declare(directive)
	statement</code>

directive部分允許設定declare程式碼段的行為,目前只認識兩個指令:ticksencodingdeclare結構也可用於全域範圍,影響到期後的所有程式碼。但如果有declare結構的檔案被其它檔案包含,則對包含它的父檔案不起作用。

Tick(時脈週期)是一個在declare程式碼段中解釋器每執行N條可計時的低階語句就會發生的事件。在每個tick中出現的事件由register_tick_function()來指定。用法大致如下。

<code>declare(ticks = 1);
function tick_handler() {
	echo "tick_hander() called.\n";
}
register_tick_function('tick_hander');</code>

可计时的低级语句有很多,register_tick_function()后会调用一次周期事件,每条语句后会调用一次周期事件,花括号结束时会调用一次周期事件。

注意,PHP中表达式不能用逗号隔开,不然会出现语法错误。这点与C语言不同,刚注意到。

可以用encoding指令来对每段脚本指定其编码方式。用法如下:

<code>declare(encoding = 'ISO-8859-1);</code>

return

如果是在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被include或者require,则控制交回调用文件。如果当前脚本时被include的,则return的值会被当作include调用的返回值,那require呢?

require

requireinclude几乎完全一样,除了处理失败的方式不同之外。

require在出错时产生E_COMPILE_ERROR级别的错误,脚本中止。而include只产生警告E_WARNING,脚本继续执行。

include

include语句包含并运行指定文件,这里要注意一下指定文件的寻找次序。

  • 被包含文件先按参数给出的路径寻找。如果定义了路径,include_path会被完全忽略。
  • 如果没有给出目录(只有文件名)时则按照include_path指定的目录寻找。若没找到才在调用脚本文件所在目录和当前工作目录下寻找。那么问题来了,调用脚本文件所在目录和当前工作目录有什么区别呢?
  • 如果最后仍未找到文件,则include结构会发出一条警告,require结构会发出一个致命错误。

当一个文件被包含时,其中包含的代码继承了include所在行的变量范围。从该处开始,被调用文件中定义的变量才可在调用文件中使用。当一个文件被包含时,语法解析器在目标文件的开头脱离PHP模式并进入HTML模式,当文件结尾回复。

对于返回值,在失败时include返回FALSE并且发出警告。成功的包含则返回1,除非在包含文件中另外给出了返回值。如果在包含文件中定义有函数,这些函数不管是在return之前还是之后定义的,都可以独立在主文件中使用。

如果来自远程服务器的文件应该在远端运行而只输出结果,那用readfile()函数更好。另一种将PHP文件包含到一个变量中的方法是用输出控制函数结合include来捕获其输出。第一次遇到,比较陌生。下面这段代码能将脚本vars.php中返回的内容输出。

<code><?php 
$string = get_include_contents('vars.php');
function get_include_contents($filename) {
	if(is_file($filename)) {
		ob_start();
		include $filename;
		$contents = ob_get_contents();
		ob_end_clean();
		return $contents;
	}
	return false;
}
echo $string;</code>

因为includerequire是一种特殊的语言结构,其参数不需要括号。如果文件被包含两次,PHP会发出致命错误,因为函数已经被定义。推荐使用include_once

require_once

require_once语句和require语句完全相同,唯一区别是,PHP会检查该文件是否已经被包含过,如果是则不会再次包含。

include_once

include_once语句和include语句类似,唯一区别是如果该文件已经被包含过,则不会再次包含。

goto

goto操作符用于跳转到程序的另一位置,目标位置可以用目标名称加上冒号来标记。PHP中的goto有一定限制,目标位置只能位于同一个文件和作用域。也就是说无法跳出一个函数或类方法,也无法跳入到任何循环或者switch结构。

(全文完)

以上就介绍了流程控制 - PHP手册笔记,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn