從0到1學PHP(三):PHP 流程控制:掌控程序的走向

目錄

  • 一、條件語句:程序的 “抉擇路口”
    • 1.1 if 語句家族:基礎與進階
    • 1.2 switch 語句:精準匹配的 “導航儀”
  • 二、循環語句:程序的 “重復舞步”
    • 2.1 for 循環:有序的 “征程”
    • 2.2 while 與 do - while 循環:條件驅動的 “旋轉門”
    • 2.3 foreach 循環:數組遍歷的 “特快列車”
  • 三、跳轉語句:程序流程的 “變奏曲”
    • 3.1 break 語句:循環與 switch 的 “急剎車”
    • 3.2 continue 語句:循環的 “加速跳過鍵”
  • 四、表達式:程序運算的 “基石”
    • 4.1 表達式的組成:代碼世界的 “積木”
    • 4.2 運算規則:表達式的 “游戲規則”


一、條件語句:程序的 “抉擇路口”

在 PHP 編程的世界里,條件語句就像是程序的 “智慧大腦”,賦予程序根據不同情況做出決策的能力。通過條件語句,我們可以讓程序在不同的條件下執行不同的代碼塊,從而實現各種復雜的業務邏輯。接下來,我們就一同探索 PHP 中條件語句的奧秘。

1.1 if 語句家族:基礎與進階

if 語句是 PHP 中最基本的條件判斷語句,它的基本形式如下:

if (條件表達式) {// 當條件表達式為true時執行的代碼
}

在這個結構中,條件表達式是一個返回布爾值(true 或 false)的表達式。如果條件表達式的結果為 true,那么大括號內的代碼塊將會被執行;如果為 false,代碼塊則會被跳過。例如,我們要判斷一個人的年齡是否達到 18 歲(即是否成年),可以這樣寫:

$age = 20;
if ($age >= 18) {echo "你已成年。";
}

在這個例子中,變量$age的值為 20,$age >= 18這個條件表達式的結果為 true,所以會輸出 “你已成年。”。

if - else 語句是 if 語句的擴展,它提供了兩種執行路徑:當條件表達式為 true 時執行 if 代碼塊;當條件表達式為 false 時執行 else 代碼塊。其語法結構如下:

if (條件表達式) {// 當條件表達式為true時執行的代碼
} else {// 當條件表達式為false時執行的代碼
}

比如,我們要判斷一個學生的考試成績是否及格(假設 60 分為及格線),代碼可以這樣實現:

$score = 75;
if ($score >= 60) {echo "成績及格。";
} else {echo "成績不及格。";
}

這里,變量$score的值為 75,$score >= 60為 true,因此會輸出 “成績及格。”。如果$score的值小于 60,就會執行 else 代碼塊,輸出 “成績不及格。”。

if - elseif - else 語句則用于處理多個條件的情況。程序會按照從上到下的順序依次檢查 if 和各個 elseif 的條件表達式,一旦某個條件表達式為 true,就會執行對應的代碼塊,并跳過后續的條件判斷。如果所有條件表達式都為 false,則執行 else 代碼塊。其語法如下:

if (條件表達式1) {// 當條件表達式1為true時執行的代碼
} elseif (條件表達式2) {// 當條件表達式2為true時執行的代碼
} elseif (條件表達式3) {// 當條件表達式3為true時執行的代碼
} else {// 當所有條件表達式都為false時執行的代碼
}

以學生成績等級評定為例,假設 90 分及以上為 “優秀”,80 - 89 分為 “良好”,70 - 79 分為 “中等”,60 - 69 分為 “及格”,60 分以下為 “不及格”,代碼可以寫成:

$score = 85;
if ($score >= 90) {echo "成績等級為:優秀";
} elseif ($score >= 80) {echo "成績等級為:良好";
} elseif ($score >= 70) {echo "成績等級為:中等";
} elseif ($score >= 60) {echo "成績等級為:及格";
} else {echo "成績等級為:不及格";
}

在這個示例中,$score的值為 85,首先判斷$score >= 90為 false,接著判斷$score >= 80為 true,所以會輸出 “成績等級為:良好”,并跳過后面的 elseif 和 else 代碼塊。

1.2 switch 語句:精準匹配的 “導航儀”

switch 語句也是一種多分支選擇語句,它根據一個表達式的值來選擇執行不同的代碼塊。其語法結構如下:

switch (表達式) {case1:// 當表達式的值等于值1時執行的代碼break;case2:// 當表達式的值等于值2時執行的代碼break;case3:// 當表達式的值等于值3時執行的代碼break;default:// 當表達式的值不等于任何一個case的值時執行的代碼break;
}

在 switch 語句中,表達式會被計算一次,然后與各個 case 后面的值進行比較。如果找到匹配的值,就會執行該 case 下的代碼塊,直到遇到break語句,break語句用于終止 switch 語句的執行,防止繼續執行下一個 case 的代碼。如果沒有找到匹配的值,且存在 default 分支,則會執行 default 下的代碼塊。

例如,我們根據一個數字來判斷是星期幾(假設 1 代表星期一,2 代表星期二,以此類推),代碼如下:

$day = 3;
switch ($day) {case 1:echo "星期一";break;case 2:echo "星期二";break;case 3:echo "星期三";break;case 4:echo "星期四";break;case 5:echo "星期五";break;case 6:echo "星期六";break;case 7:echo "星期日";break;default:echo "無效的輸入";break;
}

這里,$day的值為 3,與 case 3 匹配,所以會輸出 “星期三”,然后遇到break語句,結束 switch 語句的執行。

switch 語句與 if 語句有一定的區別。switch 語句通常適用于對一個固定值進行等值匹配的情況,它的結構更加清晰,執行效率在某些情況下可能更高,因為它直接根據表達式的值跳轉到對應的 case 分支。而 if 語句則更加靈活,不僅可以進行等值判斷,還適合用于范圍判斷(如成績等級評定中的分數范圍判斷)或復雜的條件組合判斷。例如,判斷一個數是否在某個區間內,使用 if 語句會更加方便:

$num = 50;
if ($num >= 30 && $num <= 70) {echo "數字在30到70之間";
}

這種范圍判斷用 switch 語句來實現就會比較繁瑣。所以在實際編程中,我們需要根據具體的需求來選擇使用 if 語句還是 switch 語句,以達到最佳的編程效果。

二、循環語句:程序的 “重復舞步”

循環語句是 PHP 編程中實現代碼重復執行的重要工具,它能夠讓程序在滿足特定條件的情況下,反復執行一段代碼塊,大大提高了編程效率和代碼的簡潔性。在 PHP 中,常見的循環語句有 for 循環、while 循環、do - while 循環和 foreach 循環,它們各自適用于不同的場景,下面我們就來詳細了解一下。

2.1 for 循環:有序的 “征程”

for 循環是一種非常常用的循環結構,特別適用于已知循環次數的情況。它的語法結構如下:

for (初始化表達式; 條件表達式; 遞增/遞減表達式) {// 循環體代碼
}

在這個結構中,初始化表達式在循環開始前執行一次,通常用于初始化循環變量;條件表達式在每次循環開始時進行判斷,如果為 true,則執行循環體代碼,否則結束循環;遞增/遞減表達式在每次循環體代碼執行結束后執行,用于更新循環變量,控制循環的次數。

例如,我們要遍歷一個包含數字 1 到 5 的數組,并輸出每個元素,代碼可以這樣寫:

$numbers = array(1, 2, 3, 4, 5);
for ($i = 0; $i < count($numbers); $i++) {echo $numbers[$i]. " ";
}

在這個例子中,首先定義了一個數組$numbers,然后使用 for 循環進行遍歷。$i = 0是初始化表達式,將循環變量$i初始化為 0;$i < count($numbers)是條件表達式,判斷$i是否小于數組的長度,只要滿足這個條件,就會執行循環體;$i++是遞增表達式,每次循環結束后將$i的值加 1。循環體中的echo $numbers[$i]. " ";用于輸出數組中的每個元素。

for 循環還常用于實現計數功能。比如,我們要計算從 1 到 100 的整數之和,可以這樣實現:

$sum = 0;
for ($i = 1; $i <= 100; $i++) {$sum += $i;
}
echo "1到100的和為:". $sum;

這里,$sum用于存儲累加的結果,初始值為 0。在 for 循環中,從 1 開始,每次循環將$i的值累加到$sum中,直到$i大于 100 時,循環結束,此時$sum中存儲的就是 1 到 100 的和。通過 for 循環,我們可以輕松地完成按指定次數重復執行任務的編程需求,無論是遍歷數組、計算數值,還是生成特定的序列,它都能發揮重要作用。

2.2 while 與 do - while 循環:條件驅動的 “旋轉門”

while 循環是一種條件循環,只要指定的條件為 true,就會不斷執行循環體中的代碼。它的語法形式如下:

while (條件表達式) {// 循環體代碼
}

在 while 循環中,程序首先判斷條件表達式的值,如果為 true,則執行循環體代碼,執行完循環體后再次判斷條件表達式,如此反復,直到條件表達式為 false 時,循環結束。

例如,我們使用 while 循環來計算 1 到 100 的和,代碼如下:

$i = 1;
$sum = 0;
while ($i <= 100) {$sum += $i;$i++;
}
echo "1到100的和為:". $sum;

在這個例子中,先初始化變量$i為 1,$sum為 0。然后在 while 循環中,判斷$i是否小于等于 100,如果是,則將$i累加到$sum中,并將$i加 1。不斷重復這個過程,直到$i大于 100,此時循環結束,輸出 1 到 100 的和。

do - while 循環與 while 循環類似,但有一個重要的區別:do - while 循環會先執行一次循環體,然后再判斷條件表達式。其語法結構如下:

do {// 循環體代碼
} while (條件表達式);

由于先執行循環體,所以無論條件表達式一開始是否為 true,循環體至少會被執行一次。

比如,我們用 do - while 循環來實現一個簡單的菜單輸出程序,讓用戶輸入選項,直到輸入正確的退出選項為止,代碼如下:

do {echo "請選擇操作:\n";echo "1. 查看信息\n";echo "2. 修改信息\n";echo "3. 退出\n";$choice = readline("請輸入你的選擇:");switch ($choice) {case '1':echo "你選擇了查看信息\n";break;case '2':echo "你選擇了修改信息\n";break;case '3':echo "你選擇了退出\n";break;default:echo "無效的選擇,請重新輸入\n";}
} while ($choice!= '3');

在這個程序中,首先會輸出菜單,讓用戶輸入選擇。無論用戶第一次輸入什么,菜單都會至少顯示一次。然后根據用戶的輸入進行相應的操作,并再次判斷用戶輸入是否為 ‘3’,如果不是,則繼續循環,再次顯示菜單讓用戶輸入,直到用戶輸入 ‘3’ 為止。

通過 while 和 do - while 循環的對比可以看出,while 循環適用于在執行循環體之前需要先判斷條件的情況;而 do - while 循環則適用于需要先執行一次循環體,再根據條件決定是否繼續循環的場景 。在實際編程中,我們需要根據具體的需求來選擇合適的循環結構。

2.3 foreach 循環:數組遍歷的 “特快列車”

foreach 循環是 PHP 中專門用于遍歷數組的循環結構,它提供了一種簡潔、高效的方式來訪問數組中的每個元素。其語法有兩種形式,一種用于遍歷普通數組,獲取數組的值:

foreach ($array as $value) {// 循環體代碼,$value為當前數組元素的值
}

另一種用于遍歷關聯數組或同時獲取普通數組的鍵和值:

foreach ($array as $key => $value) {// 循環體代碼,$key為當前數組元素的鍵,$value為當前數組元素的值
}

例如,我們有一個關聯數組,存儲了一個人的信息,包括姓名、年齡和城市,使用 foreach 循環來遍歷并輸出這些信息,代碼如下:

$person = array("name" => "張三", "age" => 25, "city" => "北京");
foreach ($person as $key => $value) {echo $key. ":". $value. "<br>";
}

在這個例子中,$person是一個關聯數組。通過 foreach 循環,$key依次取到數組的鍵(“name”、“age”、“city”),$value依次取到對應鍵的值(“張三”、25、“北京”),然后在循環體中輸出鍵值對信息。

如果是普通數組,我們可以使用第一種語法形式來遍歷。比如有一個存儲了學生成績的數組,要輸出每個學生的成績:

$scores = array(85, 90, 78, 92, 88);
foreach ($scores as $score) {echo "學生成績:". $score. "<br>";
}

這里,$score會依次取到數組$scores中的每個元素值,即每個學生的成績,并輸出。

foreach 循環在遍歷數組時非常方便,不需要像 for 循環那樣手動控制索引,減少了出錯的可能性,同時代碼也更加簡潔易讀。無論是處理簡單的一維數組,還是復雜的多維數組,foreach 循環都能輕松勝任,是 PHP 數組遍歷的首選工具之一 。

三、跳轉語句:程序流程的 “變奏曲”

在 PHP 程序的執行過程中,跳轉語句就像是神奇的 “魔法棒”,能夠改變程序的執行順序,讓代碼的執行更加靈活和高效。跳轉語句主要包括 break 語句和 continue 語句,它們在循環和 switch 語句中發揮著重要的作用,接下來我們就詳細了解一下這兩種跳轉語句。

3.1 break 語句:循環與 switch 的 “急剎車”

break 語句的主要作用是終止當前循環或者 switch 語句的執行,并將程序的控制權轉移到被終止語句之后的下一條語句。在循環中,當滿足特定條件時,使用 break 語句可以立即結束循環,不再執行循環體中剩余的代碼;在 switch 語句中,break 語句用于跳出 switch 結構,避免執行多余的 case 分支。

在 for 循環中查找數組中是否存在特定元素,如果找到則終止循環,示例代碼如下:

$numbers = array(10, 20, 30, 40, 50);
for ($i = 0; $i < count($numbers); $i++) {if ($numbers[$i] == 30) {echo "找到了元素30";break;}
}

在這個例子中,當$numbers[$i]的值等于 30 時,break語句被執行,循環立即終止,不再繼續遍歷數組后面的元素。

在 switch 語句中,當匹配到相應的 case 時,使用 break 語句跳出 switch 結構,示例代碼如下:

$dayOfWeek = 3;
switch ($dayOfWeek) {case 1:echo "星期一";break;case 2:echo "星期二";break;case 3:echo "星期三";break;case 4:echo "星期四";break;case 5:echo "星期五";break;case 6:echo "星期六";break;case 7:echo "星期日";break;default:echo "無效的輸入";break;
}

這里,當$dayOfWeek的值為 3 時,匹配到 case 3,輸出 “星期三”,然后執行break語句,跳出 switch 語句,不再執行后面的其他 case 分支。

3.2 continue 語句:循環的 “加速跳過鍵”

continue 語句的作用是跳過當前循環中剩余的代碼,直接開始下一次循環迭代。它不會終止整個循環,只是跳過本次循環中continue語句后面的部分,然后回到循環的開頭,重新判斷循環條件,決定是否繼續執行下一次循環。

例如,在一個 for 循環中,我們要輸出 1 到 10 之間的奇數,可以使用 continue 語句跳過偶數,示例代碼如下:

for ($i = 1; $i <= 10; $i++) {if ($i % 2 == 0) {continue;}echo $i. " ";
}

在這個循環中,當$i是偶數時,if ($i % 2 == 0)條件成立,執行continue語句,跳過echo $i. " ";這行代碼,直接進入下一次循環,即$i自增后再次判斷循環條件,只有當$i為奇數時,才會輸出$i的值。最終輸出的結果為 “1 3 5 7 9” 。通過continue語句,我們可以在循環中靈活地控制哪些代碼需要執行,哪些需要跳過,使得程序能夠更加精準地滿足我們的業務需求 。

四、表達式:程序運算的 “基石”

4.1 表達式的組成:代碼世界的 “積木”

表達式是 PHP 程序中進行各種運算和操作的基本單元,它就像是代碼世界中的 “積木”,通過不同的組合方式構建出豐富多彩的程序邏輯。簡單來說,表達式由操作數和運算符組成。操作數可以是常量、變量、函數調用的返回值等,它代表了參與運算的數據;運算符則定義了對操作數進行的具體運算操作。

在 PHP 中,常見的運算符包括算術運算符(如 +、-、、/、%)、比較運算符(如 ==、!=、>、<、>=、<=)、邏輯運算符(如 &&、||、!)、賦值運算符(如 =、+=、-=、=、/= 等)以及其他一些特殊運算符。

例如,一個簡單的數學運算表達式$a + $b,其中$a和$b是操作數,這里假設它們是已定義的變量,存儲了具體的數值,+是算術運算符,表示加法運算,該表達式的作用是將$a和$b的值相加。

再比如條件判斷表達式$age >= 18,$age是操作數,代表一個人的年齡,>=是比較運算符,用于比較$age的值是否大于或等于 18,這個表達式會返回一個布爾值(true 或 false),可以用于條件語句中進行邏輯判斷。

4.2 運算規則:表達式的 “游戲規則”

當編寫復雜的表達式時,需要遵循一定的運算規則,這些規則決定了表達式中各個部分的計算順序,就如同游戲規則一樣,確保程序能夠正確地執行運算。表達式的運算規則主要涉及運算符的優先級和結合性。

運算符優先級定義了不同運算符在表達式中的運算先后順序。優先級高的運算符會先進行運算,優先級低的運算符后進行運算。例如,在算術運算中,乘法和除法的優先級高于加法和減法。所以在表達式3 + 4 * 2中,先計算4 * 2,得到 8,然后再計算3 + 8,最終結果為 11。

運算符的結合性則規定了在優先級相同的情況下,運算符的計算方向。結合性分為左結合性和右結合性。左結合性表示從左到右依次計算,例如加法和減法運算符是左結合性,在表達式10 - 5 + 3中,先計算10 - 5得到 5,再計算5 + 3,結果為 8;右結合性表示從右到左依次計算,例如賦值運算符是右結合性,在表達式$a = $b = 10中,先將 10 賦值給$b,然后再將$b的值(也就是 10)賦值給$a。

以下是一個更復雜的數學表達式計算示例,展示運算順序和規則的應用:

$a = 2;
$b = 3;
$c = 4;
$result = ($a + $b) * $c / ($a + $c);
echo $result; 

在這個例子中,首先計算括號內的表達式,即$a + $b得到 5,$a + $c得到 6;然后按照先乘除后加減的優先級順序,計算乘法5 * $c得到 20;最后計算除法20 / 6,得到結果約為 3.33(實際結果根據 PHP 的浮點數精度表示)。通過合理運用運算符的優先級和結合性規則,我們能夠準確地控制表達式的計算過程,實現各種復雜的數學運算和邏輯判斷,為 PHP 程序的功能實現提供堅實的基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91435.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91435.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91435.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uni-app框架基礎

闡述 MVC 模式1, MVC與MVVMMVC 他是后端的一個開發思想MVVM是基于MVC中的view這層所分離出來的一種設計模式。MVC架構詳解MVC&#xff08;Model-View-Controller&#xff09;是一種廣泛使用的軟件設計模式&#xff0c;主要用于分離應用程序的業務邏輯、用戶界面和輸入控制。這種…

智慧收銀系統開發進銷存庫存統計,便利店、水果店、建材與家居行業的庫存匯總管理—仙盟創夢IDE

在零售與批發行業的數字化轉型中&#xff0c;當前庫存匯總作為進銷存管理的核心環節&#xff0c;直接影響著企業的資金周轉、銷售決策和客戶滿意度。現代收銀系統已超越傳統的收款功能&#xff0c;成為整合多渠道數據、實現實時庫存匯總的中樞神經。本文將深入剖析便利店、水果…

selenium(WEB自動化工具)

定義解釋 Selenium是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中&#xff0c;就像真正的用戶在操作一樣。支持的瀏覽器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&#xff0…

windows本地使用conda部署Open-webui

前提條件 Open-webui使用python3.11.9 步驟 conda操作也可以參考 安裝python torch、transformer、記錄 1、conda環境 # 創建環境 conda create --name openwebui python3.11.9# 激活環境 conda activate openwebui# 升級pip版本 pip install --upgrade pip# pip安裝openwe…

【Unity筆記04】數據持久化

&#x1f31f; 方案核心思想遵循以下設計原則&#xff1a;數據安全第一&#xff1a;絕不使用明文存儲&#xff0c;采用AES加密算法保護數據。性能優化&#xff1a;使用異步I/O操作&#xff0c;避免阻塞主線程導致游戲卡頓。結構清晰&#xff1a;模塊化設計&#xff0c;職責分離…

深入理解 HTML5 Web Workers:提升網頁性能的關鍵技術解析

深入理解 HTML5 Web Workers&#xff1a;提升網頁性能的關鍵技術解析引言1. 什么是 Web Workers&#xff1f;Web Workers 的特點&#xff1a;2. Web Workers 的使用方式2.1 創建一個 Web Worker步驟 1&#xff1a;創建 Worker 文件步驟 2&#xff1a;在主線程中調用 Worker3. W…

會議室預定系統核心技術:如何用一行SQL解決時間沖突檢測難題

文章目錄 一、為什么時間沖突檢測是預定系統的核心挑戰? 二、黃金法則:兩行線段重疊檢測法 三、四大沖突場景實戰解析(同一會議室) 四、生產環境完整解決方案 1. 基礎沖突檢測函數 2. 預定API處理流程 3. 高級邊界處理技巧 五、性能優化關鍵策略 六、不同數據庫的適配方案 …

13.正則表達式:文本處理的瑞士軍刀

正則表達式&#xff1a;文本處理的瑞士軍刀 &#x1f3af; 前言&#xff1a;當文本遇上神奇的密碼 想象一下&#xff0c;你是一個圖書管理員&#xff0c;面對著一堆亂七八糟的書籍信息&#xff1a; “聯系電話&#xff1a;138-1234-5678”“郵箱地址&#xff1a;zhang.sangm…

linux下c語言訪問mysql數據庫

一、連接數據庫基礎1. 頭文件與庫文件連接 MySQL 需包含的頭文件&#xff1a;#include <mysql/mysql.h> // 部分環境也可用 #include <mysql.h> 編譯鏈接時&#xff0c;Linux 平臺需指定庫名&#xff1a;-lmysqlclient &#xff0c;用于鏈接 MySQL 客戶端函數庫。2…

6. 傳輸層協議 UDP

傳輸層負責數據能夠從發送端傳輸接收端.1. 再談端口號端口號(Port)標識了一個主機上進行通信的不同的應用程序在 TCP/IP 協議中, 用 "源 IP", "源端口號", "目的 IP", "目的端口號", "協議號" 這樣一個五元組來標識一個通信…

vue 開發總結:從安裝到第一個交互頁面-與數據庫API

vue 總結 1、安裝vue&#xff1a; WinR 輸入&#xff1a;cnpm install -g vue/cli 驗證是否安裝成功&#xff1a;vue --version 2、新建Vue工程 在對應文件夾下右擊打開集成終端 輸入 vue create query_system&#xff08;新建項目名字&#xff09;名稱不能存在大寫&#x…

運維筆記:HTTP 性能優化

一、HTTP 協議特性與性能瓶頸1.1 HTTP 協議發展歷程HTTP 協議的演進直接影響著 Web 性能&#xff0c;各版本關鍵特性對比&#xff1a;協議版本發布時間核心特性性能優勢局限性HTTP/1.01996 年無狀態、短連接簡單易實現每次請求需建立 TCP 連接HTTP/1.11999 年長連接、管道化減少…

ubuntu:運行gcfsd-admin守護進程需要認證,解決方法

這里有個鎖子&#xff0c;每次進入都要輸入密碼&#xff0c;怎么解決&#xff1f; 重新掛載 /data 磁盤 sudo umount /data sudo ntfsfix /dev/sda1 sudo mount -o rw /dev/sda1 /data

1.DRF 環境安裝與配置

文章目錄一. Django Rest_Framework二、環境安裝與配置2.1 安裝 DRF2.2 創建Django項目2.3 添加 rest_framework 應用三、啟動項目一. Django Rest_Framework 核心思想&#xff1a;大量縮減編寫 api 接口的代碼 Django REST framework 是一個建立在 Django 基礎之上的 Web 應…

設計模式(十九)行為型:備忘錄模式詳解

設計模式&#xff08;十九&#xff09;行為型&#xff1a;備忘錄模式詳解備忘錄模式&#xff08;Memento Pattern&#xff09;是 GoF 23 種設計模式中的行為型模式之一&#xff0c;其核心價值在于在不破壞封裝性的前提下&#xff0c;捕獲并外部化一個對象的內部狀態&#xff0c…

Qt/C++開發監控GB28181系統/錄像回放/切換播放進度立即跳轉/支持8倍速播放/倍速和跳轉進度無縫切換

一、前言說明 在國標監控系統中&#xff0c;錄像回放過程中&#xff0c;需要切換播放進度&#xff0c;對比過很過國標系統&#xff0c;絕大部分尤其是網頁版的監控系統&#xff0c;在切換進度過程中都會黑屏&#xff0c;這個體驗就很不友好了&#xff0c;明明gb28181協議中就有…

【11】大恒相機SDK C++開發 ——原圖像數據IFrameData內存中上下顛倒,怎么裁剪ROI 實時顯示在pictureBox中

文章目錄3 當內存中的 圖像數據是垂直翻轉的時候怎么截取ROI 并顯示3.1 對ROI在原圖中的位置做轉換3.2 將ROI的最后一行當做開始位置&#xff0c;從底部向上復制數據3.3 完整代碼3.4 圖像數據在內存中上下顛倒的情況3.5 調用驗證4 unsafe代碼 解釋及注意事項 看我另一篇文章5 C…

小架構step系列29:校驗注解的組合

1 概述如果遇到某些屬性需要多種校驗&#xff0c;比如需要非空、符合某正則表達式、長度不能超過某值等&#xff0c;如果這種屬性只有有限幾個&#xff0c;那么手工把對應的校驗注解都加上即可。但如果這種屬性比較多&#xff0c;那么重復加這些校驗注解&#xff0c;也是一種代…

網絡基礎19:OSPF多區域實驗

一、拓撲結構1. 網絡拓撲&#xff1a;骨干區域&#xff08;Area 0&#xff09;&#xff1a;連接核心設備&#xff08;AR1、AR2、AR3、AR4、AR5、AR6&#xff09;。非骨干區域&#xff1a;Area 1&#xff1a;AR5 ? AR9Area 2&#xff1a;AR5 ? AR10Area 3&#xff1a;AR6 ? A…

goland編寫go語言導入自定義包出現: package xxx is not in GOROOT (/xxx/xxx) 的解決方案

問題 寫了個自定義的包 calc.go&#xff0c;在路徑 $GOPATH/go_project/src/demo_51_package/com/目錄下&#xff0c;其中main.go 是main方法的入口代碼 main.go 代碼如下 package main import "demo_51_package/com" func main() {add : calc.Add(1, 2)println(add)…