腳本由語句構成,語句靠流程控制實作功能,這一節主要介紹了幾個關鍵字的使用。
elseif
elseif
和else if
的行為完全一樣,如果用冒號來定義if/elseif
條件,那就不能用兩個單字的else ifif
else if
<code><span><?php </span><span>$a</span> = <span>1</span>; <span>$b</span> = <span>2</span>; <span>if</span>(<span>$a</span> > <span>$b</span>) : <span>echo</span><span>"$a is greater than $b"</span>; <span>elseif</span>(<span>$a</span> == <span>$b</span>) : <span>echo</span><span>"$a equals $b"</span>; <span>else</span> : <span>echo</span><span>"$a is neither greater than or equal to $b"</span>; <span>endif</span>;</span></code>替代語法下面的這些關鍵字可以使用流程控制的替代語法,基本形式是把左花括號換成冒號,右花括號換成下面的字元。
<code><span>if</span> - <span>endif</span><span>while</span> - <span>endwhile</span><span>for</span> - <span>endfor</span><span>foreach</span> - <span>endforeach</span><span>switch</span> - <span>endswitch</span></code>注意! PHP不支援在同一控制區塊內混合使用兩種語法。 do-while這個循環乍看起來挺熟悉的,但是卻忽略了它的某些用法。
手冊中說,資深的C語言使用者可能熟悉另一種不同的
do-while循環用法,把語句放在
do-while(0)
順便搜尋整理一下
do-while(0)
-
程式碼分塊,比僅僅使用花括號更直觀。 -
使用
break
跳過剩餘的一段程式碼。 -
有利於巨集定義函數,使用時句尾可以加分號,看起來更像函數呼叫。 -
塊級作用域,避免變數名稱擴散到上層作用域。 -
變形的
goto 語句。
foreach
僅能夠應用於陣列和物件的遍歷。
foreach
<code><span>foreach</span>(array_expression <span>as</span><span>$value</span>) statement <span>foreach</span>(array_expression <span>as</span><span>$key</span> => <span>$value</span>) statement</code>
要修改數組元素的值需要使用引用賦值,透過在
$value前加上
&實現。
<code><span><?php </span><span>$arr</span> = <span>array</span>(<span>1</span>, <span>2</span>, <span>3</span>, <span>4</span>); <span>foreach</span>(<span>$arr</span><span>as</span> &<span>$value</span>) { <span>$value</span> = <span>$value</span> * <span>2</span>; } <span>unset</span>(<span>$value</span>); <span>foreach</span>(<span>$arr</span><span>as</span><span>$value</span>) { <span>echo</span><span>"$value "</span>; <span>// 2 4 6 8</span> }</span></code>
注意!數組最後一個元素的
$value引用在
foreach循環之後仍會保留,建議使用
unset()將其銷毀。 list-each在範例程式中,也發現了一種特殊的遍歷方法,姑且稱作
list-each
當
foreach開始執行時,數組內部的指標會自動指向第一個單元,因此不需要在
foreach循環之前呼叫
reset()。但是對於
while中的
list-each,數組內部指針
$arr會一直存在著,因此在下次循環前需要
reset($arr)
<code><span><?php </span><span>$arr</span> = <span>array</span>(<span>'one'</span>, <span>'two'</span>, <span>'three'</span>); <span>// reset($arr);</span><span>while</span>(<span>list</span>(<span>$key</span>, <span>$value</span>) = each(<span>$arr</span>)) { <span>echo</span><span>"Key: $key; Value: $value "</span>; } reset(<span>$arr</span>); <span>while</span>(<span>list</span>(<span>$key</span>, <span>$value</span>) = each(<span>$arr</span>)) { <span>echo</span><span>"Key: $key; Value: $value "</span>; }</span></code>
在上面這段程式碼中,第一個
reset可以省略,但第二個
reset不能省。 listPHP 5.5增添了遍歷一個陣列的陣列的功能,並且把嵌套的陣列解包到循環變數中。
<code><span><?php </span><span>$array</span> = [ [<span>1</span>, <span>2</span>], [<span>3</span>, <span>4</span>], ]; <span>foreach</span>(<span>$array</span><span>as</span><span>list</span>(<span>$a</span>, <span>$b</span>)) { <span>echo</span><span>"A: $a; B: $b"</span>; }</span></code>
list()中的單元可以少於嵌套數組的,此時多出來的數組單元將被忽略。若多於,將發出錯誤訊息。 breakbreak
用來結束當前
for/foreach/while/do-while/switch結構的執行。
break
break
<code><span><?php </span><span>while</span>(<span>1</span>) { <span>while</span>(<span>1</span>) { <span>echo</span><span>'hello '</span>; <span>break</span><span>2</span>; } } <span>echo</span><span>'world'</span>;</span></code>特地在C語言裡嘗試了一下,提示語法錯誤。 continue
與
break相似,
continue
注意!在PHP中
switch語句被認為是可以使用
continue
手冊中說,PHP和其它語言不同,
continue語句作用到
switch上的作用類似於
break
switch/case
做的是鬆散比較
==,而不是嚴格比較
===。效率方面,
switch語句中條件只求值一次並用來和每個
case語句比較。
case表達式可以是任何求值為簡單類型的表達式,不能用陣列或物件。允許使用分號代替
case
declare
<code><span>declare</span>(directive) statement</code>
directive部分允許設定
declare碼
directive部分允許設定
declare碼
和encoding
。 declare結構也可用於全域範圍,影響到期後的所有程式碼。但如果有declare
結構的檔案被其它檔案包含,則對包含它的父檔案不起作用。 Tick(時脈週期)是一個在
<code><span>declare</span>(ticks = <span>1</span>); <span><span>function</span><span>tick_handler</span><span>()</span></span>{ <span>echo</span><span>"tick_hander() called.\n"</span>; } register_tick_function(<span>'tick_hander'</span>);</code>
可计时的低级语句有很多,register_tick_function()
后会调用一次周期事件,每条语句后会调用一次周期事件,花括号结束时会调用一次周期事件。
注意,PHP中表达式不能用逗号隔开,不然会出现语法错误。这点与C语言不同,刚注意到。
可以用encoding指令来对每段脚本指定其编码方式。用法如下:
<code><span>declare</span>(encoding = <span>'ISO-8859-1);</span></code>
return
如果是在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被include
或者require
,则控制交回调用文件。如果当前脚本时被include
的,则return
的值会被当作include
调用的返回值,那require
呢?
require
require
和include
几乎完全一样,除了处理失败的方式不同之外。
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><span><?php </span><span>$string</span> = get_include_contents(<span>'vars.php'</span>); <span><span>function</span><span>get_include_contents</span><span>(<span>$filename</span>)</span></span>{ <span>if</span>(is_file(<span>$filename</span>)) { ob_start(); <span>include</span><span>$filename</span>; <span>$contents</span> = ob_get_contents(); ob_end_clean(); <span>return</span><span>$contents</span>; } <span>return</span><span>false</span>; } <span>echo</span><span>$string</span>;</span></code>
因为include
和require
是一种特殊的语言结构,其参数不需要括号。如果文件被包含两次,PHP会发出致命错误,因为函数已经被定义。推荐使用include_once
。
require_once
require_once
语句和require
语句完全相同,唯一区别是,PHP会检查该文件是否已经被包含过,如果是则不会再次包含。
include_once
include_once
语句和include
语句类似,唯一区别是如果该文件已经被包含过,则不会再次包含。
goto
goto
操作符用于跳转到程序的另一位置,目标位置可以用目标名称加上冒号来标记。PHP中的goto
有一定限制,目标位置只能位于同一个文件和作用域。也就是说无法跳出一个函数或类方法,也无法跳入到任何循环或者switch
结构。
(全文完)
浅谈PHP语音里的流程控制及实现方法
脚本由语句构成,语句靠流程控制实现功能,这一节主要介绍了几个关键字的使用。
elseif
elseif
和else if
的行为完全一样,如果用冒号来定义if/elseif
条件,那就不能用两个单词的else if
,否则PHP会产生解析错误。
<code><span><?php </span><span>$a</span> = <span>1</span>; <span>$b</span> = <span>2</span>; <span>if</span>(<span>$a</span> > <span>$b</span>) : <span>echo</span><span>"$a is greater than $b"</span>; <span>elseif</span>(<span>$a</span> == <span>$b</span>) : <span>echo</span><span>"$a equals $b"</span>; <span>else</span> : <span>echo</span><span>"$a is neither greater than or equal to $b"</span>; <span>endif</span>;</span></code>
替代语法
下面的这些关键字可以使用流程控制的替代语法,基本形式是把左花括号换成冒号,右花括号换为下面的字符。
<code><span>if</span> - <span>endif</span><span>while</span> - <span>endwhile</span><span>for</span> - <span>endfor</span><span>foreach</span> - <span>endforeach</span><span>switch</span> - <span>endswitch</span></code>
注意!PHP不支持在同一控制块内混合使用两种语法。
do-while
这个循环乍看起来挺熟悉的,但是却忽略了它的某些用法。
手册中说,资深的C语言用户可能熟悉另一种不同的do-while
循环用法,把语句放在do-while(0)
之中。我竟然第一次听说有这种技巧,看来我还是C语言小白。
顺便搜索整理一下do-while(0)
这种特殊用法的好处吧。
- 代码分块,比仅仅使用花括号更直观。
- 使用
break
跳过剩余的一段代码。
- 有利于宏定义函数,使用时句尾可以加分号,看起来更像函数调用。
- 块级作用域,避免变量名扩散到上层作用域。
- 变形的
goto
语句。
这个帖子讲的挺好的,do{}while(0) 的作用 - c++ - SegmentFault。
淮安掼蛋下载(http://www.gamefrye.com/)
foreach
foreach
仅能够应用于数组和对象的遍历。foreach
语法结构提供了遍历数组的简单方式,有下面两种语法。
<code><span>foreach</span>(array_expression <span>as</span><span>$value</span>) statement <span>foreach</span>(array_expression <span>as</span><span>$key</span> => <span>$value</span>) statement</code>
要修改数组元素的值需要使用引用赋值,通过在$value
前加&
实现。
<code><span><?php </span><span>$arr</span> = <span>array</span>(<span>1</span>, <span>2</span>, <span>3</span>, <span>4</span>); <span>foreach</span>(<span>$arr</span><span>as</span> &<span>$value</span>) { <span>$value</span> = <span>$value</span> * <span>2</span>; } <span>unset</span>(<span>$value</span>); <span>foreach</span>(<span>$arr</span><span>as</span><span>$value</span>) { <span>echo</span><span>"$value "</span>; <span>// 2 4 6 8</span> }</span></code>
注意!数组最后一个元素的$value
引用在foreach
循环之后仍会保留,建议使用unset()
将其销毁。
list-each
在示例程序中,还发现了一种特殊的遍历方法,姑且称作list-each
。
当foreach
开始执行时,数组内部的指针会自动指向第一个单元,因此不需要在foreach
循环之前调用reset()
。但是对于while
中的list-each
,数组内部指针$arr
会一直存在着,因此在下次循环前需要reset($arr)
。
<code><span><?php </span><span>$arr</span> = <span>array</span>(<span>'one'</span>, <span>'two'</span>, <span>'three'</span>); <span>// reset($arr);</span><span>while</span>(<span>list</span>(<span>$key</span>, <span>$value</span>) = each(<span>$arr</span>)) { <span>echo</span><span>"Key: $key; Value: $value "</span>; } reset(<span>$arr</span>); <span>while</span>(<span>list</span>(<span>$key</span>, <span>$value</span>) = each(<span>$arr</span>)) { <span>echo</span><span>"Key: $key; Value: $value "</span>; }</span></code>
在上面这段代码中,第一个reset
可以省略,但第二个reset
不能省。
list
PHP 5.5增添了遍历一个数组的数组的功能,并且把嵌套的数组解包到循环变量中。
<code><span><?php </span><span>$array</span> = [ [<span>1</span>, <span>2</span>], [<span>3</span>, <span>4</span>], ]; <span>foreach</span>(<span>$array</span><span>as</span><span>list</span>(<span>$a</span>, <span>$b</span>)) { <span>echo</span><span>"A: $a; B: $b"</span>; }</span></code>
list()
中的单元可以少于嵌套数组的,此时多出来的数组单元将被忽略。若多于,将发出错误信息。
break
break
用来结束当前for/foreach/while/do-while/switch
结构的执行。break
可以接受一个可选的数字参数来决定跳出几重循环,但参数不能为变量。
break
跳出多重循环还是第一次遇到,特意写了个小程序尝试了一下。
<code><span><?php </span><span>while</span>(<span>1</span>) { <span>while</span>(<span>1</span>) { <span>echo</span><span>'hello '</span>; <span>break</span><span>2</span>; } } <span>echo</span><span>'world'</span>;</span></code>
特地在C语言里尝试了一下,提示语法错误。
continue
与break
相似,continue
也可以接受一个可选的数字参数来决定跳过几重循环到循环结尾。
注意!在PHP中switch
语句被认为是可以使用continue
的一种循环结构。
switch
手册中说,PHP和其它语言不同,continue
语句作用到switch
上的作用类似于break
。这是什么意思呢?
switch/case
做的是松散比较==
,而不是严格比较===
。效率方面,switch
语句中条件只求值一次并用来和每个case
语句比较。case
表达式可以是任何求值为简单类型的表达式,不能用数组或对象。允许使用分号代替case
语句后的冒号。
declare
declare
结构用来设定一段代码的执行指令,语法结构如下:
<code><span>declare</span>(directive) statement</code>
directive
部分允许设定declare
代码段的行为,目前只认识两个命令:ticks
和encoding
。declare
结构也可用于全局范围,影响到期后的所有代码。但如果有declare
结构的文件被其它文件包含,则对包含它的父文件不起作用。
Tick(时钟周期)是一个在declare
代码段中解释器每执行N条可计时的低级语句就会发生的事件。在每个tick中出现的事件由register_tick_function()
来指定。用法大致如下。
<code><span>declare</span>(ticks = <span>1</span>); <span><span>function</span><span>tick_handler</span><span>()</span></span>{ <span>echo</span><span>"tick_hander() called.\n"</span>; } register_tick_function(<span>'tick_hander'</span>);</code>
可计时的低级语句有很多,register_tick_function()
后会调用一次周期事件,每条语句后会调用一次周期事件,花括号结束时会调用一次周期事件。
注意,PHP中表达式不能用逗号隔开,不然会出现语法错误。这点与C语言不同,刚注意到。
可以用encoding指令来对每段脚本指定其编码方式。用法如下:
<code><span>declare</span>(encoding = <span>'ISO-8859-1);</span></code>
return
如果是在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被include
或者require
,则控制交回调用文件。如果当前脚本时被include
的,则return
的值会被当作include
调用的返回值,那require
呢?
require
require
和include
几乎完全一样,除了处理失败的方式不同之外。
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><span><?php </span><span>$string</span> = get_include_contents(<span>'vars.php'</span>); <span><span>function</span><span>get_include_contents</span><span>(<span>$filename</span>)</span></span>{ <span>if</span>(is_file(<span>$filename</span>)) { ob_start(); <span>include</span><span>$filename</span>; <span>$contents</span> = ob_get_contents(); ob_end_clean(); <span>return</span><span>$contents</span>; } <span>return</span><span>false</span>; } <span>echo</span><span>$string</span>;</span></code>
因为include
和require
是一种特殊的语言结构,其参数不需要括号。如果文件被包含两次,PHP会发出致命错误,因为函数已经被定义。推荐使用include_once
。
require_once
require_once
语句和require
语句完全相同,唯一区别是,PHP会检查该文件是否已经被包含过,如果是则不会再次包含。
include_once
include_once
语句和include
语句类似,唯一区别是如果该文件已经被包含过,则不会再次包含。
goto
goto
操作符用于跳转到程序的另一位置,目标位置可以用目标名称加上冒号来标记。PHP中的goto
有一定限制,目标位置只能位于同一个文件和作用域。也就是说无法跳出一个函数或类方法,也无法跳入到任何循环或者switch
结构。
(全文完)
以上就介绍了浅谈PHP语音里的流程控制及实现方法,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

會話ID應在登錄時、敏感操作前和每30分鐘定期重新生成。 1.登錄時重新生成會話ID可防會話固定攻擊。 2.敏感操作前重新生成提高安全性。 3.定期重新生成降低長期利用風險,但需權衡用戶體驗。

在PHP中設置會話cookie參數可以通過session_set_cookie_params()函數實現。 1)使用該函數設置參數,如過期時間、路徑、域名、安全標誌等;2)調用session_start()使參數生效;3)根據需求動態調整參數,如用戶登錄狀態;4)注意設置secure和httponly標誌以提升安全性。

在PHP中使用會話的主要目的是維護用戶在不同頁面之間的狀態。 1)會話通過session_start()函數啟動,創建唯一會話ID並存儲在用戶cookie中。 2)會話數據保存在服務器上,允許在不同請求間傳遞數據,如登錄狀態和購物車內容。

如何在子域名間共享會話?通過設置通用域名的會話cookie實現。 1.在服務器端設置會話cookie的域為.example.com。 2.選擇合適的會話存儲方式,如內存、數據庫或分佈式緩存。 3.通過cookie傳遞會話ID,服務器根據ID檢索和更新會話數據。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),