時(shí)間:2023-05-27 03:09:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-05-27 03:09:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
小白7天入門(mén)PHP Web開(kāi)發(fā) - Day 4 后端PHP入門(mén):《小白7天入門(mén)PHP Web開(kāi)發(fā)》系列文章,面向單純善良的完全不懂Web開(kāi)發(fā)編程的入門(mén)速成課程,小白們?nèi)绻信d趣可以研讀此系列文章,也可以連線提問(wèn)。各路大神有何指教還請(qǐng)指點(diǎn)一二。希望各路大神手下留情,注意維護(hù)自己的身份和形象。拜謝各位。上一篇文章 我們學(xué)會(huì)了使用簡(jiǎn)單的CSS完成了對(duì)HTML頁(yè)面的修飾和美化布局,以及以表單提交驗(yàn)證為例的JS的基本使用,這節(jié)我們開(kāi)始嘗試使用PHP來(lái)做后端處理表單提交后的相關(guān)操作。
PHP全稱為 PHP: Hypertext Preprocessor(更名前是 Personal Home Page ),中文名字叫超文本預(yù)處理器,是一種開(kāi)源腳本編程語(yǔ)言,是常用的web開(kāi)發(fā)語(yǔ)言(從舊名稱就可以看出)。這里我們需要了解一個(gè)概念:靜態(tài)網(wǎng)站和動(dòng)態(tài)網(wǎng)站。
<?php/* * PHP代碼通常被包含在這個(gè)標(biāo)簽中 * 開(kāi)始標(biāo)簽是 <?php * 結(jié)束標(biāo)簽是 ?> * 如果文件中只有PHP代碼,沒(méi)有任何別的東西,結(jié)束標(biāo)簽可以不要,這種情況下也建議 * 不要(避免頁(yè)面輸出一些空串影響頁(yè)面) */// PHP 代碼寫(xiě)在這里,如下面 echo "Hello PHP, hello web"; // 在頁(yè)面上輸出字符串 Hello PHP, hello web?>
2、運(yùn)行環(huán)境<!-- score.html --><!-- 使用 localhost/score.html 訪問(wèn)或直接用瀏覽器打開(kāi)文件 --><!-- score.html文件應(yīng)與后續(xù).php文件在同一個(gè)目錄下 --><!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>成績(jī)轉(zhuǎn)評(píng)級(jí)</title> <style type="text/css"> /*通用樣式*/ * { font-size: 14px; margin: 0; padding: 0; } /*說(shuō)明部分樣式*/ .explain { background-color: #f4f4f4; margin-top: 100px; padding: 20px 0px; } .block { text-align: left; width: 400px; margin: 0 auto; } .block ul { list-style: none; } /*表單部分樣式*/ .form { width: 400px; margin: 0 auto; margin-top: 20px; } .form input, .form button { height: 36px; box-sizing: border-box; margin-top: 10px; padding: 5px 10px; } .form input { width: 100%; } .form button { width: 100px; } </style></head><body> <div class="explain"> <div class="block"> <ul> <li>1、 學(xué)生成績(jī)90分(含)以上,評(píng)級(jí)為A</li> <li>2、 學(xué)生成績(jī)?cè)?0分(含)以上,90分以下,評(píng)級(jí)為B</li> <li>3、 學(xué)生成績(jī)?cè)?0分(含)以上,80分以下,評(píng)級(jí)為C</li> <li>4、 學(xué)生成績(jī)?cè)?0分以下,評(píng)級(jí)為D</li> </ul> </div> </div> <div class="form"> <form action="scorelevel.php" method="get" accept-charset="utf-8" target="_blank" onsubmit="return checkform()"> <input type="text" name="study_name" value="" placeholder="請(qǐng)輸入學(xué)生姓名"> <input type="text" name="study_score" value="" placeholder="請(qǐng)輸入學(xué)生成績(jī)"> <br> <button type="submit">檢測(cè)評(píng)級(jí)</button> </form> </div> <script> function checkform() { var study_name = document.getElementsByName('study_name')[0].value; var study_score = document.getElementsByName('study_score')[0].value; if ( !(study_name && study_score) ) { alert('學(xué)生姓名和學(xué)生成績(jī)不能為空'); return false; } } </script></body></html>
這個(gè)HTML文件叫 score.html,里面主要是一個(gè)表單與后端php文件交互,所以我們要新建一個(gè)在action屬性里面的那個(gè)名字的php文件<form action="scorelevel.php" method="get" accept-charset="utf-8" _blank="self">
用sbt新建 scorelevel.php,注意這里建議 保持score.html和scorelevel.php同在根目錄下(action里面其實(shí)就是php文件的地址,所以你能保證路徑對(duì)就可以),以下是php文件的代碼,你大可以先復(fù)制進(jìn)去我們?cè)賮?lái)逐個(gè)了解。<?php/** * 我們以 “用戶輸入學(xué)生成績(jī),根據(jù)學(xué)生成績(jī)對(duì)學(xué)生評(píng)級(jí)并輸出” 的功能需求來(lái)做示例 * 需求的基本內(nèi)容: * 學(xué)生成績(jī)90分(含)以上,評(píng)級(jí)為A * 學(xué)生成績(jī)?cè)?0分(含)以上,90分以下,評(píng)級(jí)為B * 學(xué)生成績(jī)?cè)?0分(含)以上,80分以下,評(píng)級(jí)為C * 學(xué)生成績(jī)?cè)?0分以下,評(píng)級(jí)為D */// 首先考慮,成績(jī)從哪里來(lái)?用戶輸入提交過(guò)來(lái)的# 獲取用戶提交的學(xué)生名字和成績(jī)$study_name = isset($_GET['study_name']) ? $_GET['study_name'] : '';$study_score = isset($_GET['study_score']) ? $_GET['study_score'] : '';// 初始化評(píng)級(jí)$level = '未知';$level_label = '未知';// 檢測(cè)姓名和分?jǐn)?shù)是否為空if ( $study_name == '' || $study_score == '' ) { echo '學(xué)生姓名和學(xué)生成績(jī)未知,請(qǐng)檢查提交的數(shù)據(jù)是否為空'; die;}// 根據(jù)分?jǐn)?shù)給學(xué)生評(píng)級(jí)if ( $study_score >= 90 ) { $level = 'A';} elseif ( $study_score >= 80 && $study_score < 90 ) { $level = 'B';} elseif ( $study_score >= 60 && $study_score < 80 ) { $level = 'C';} elseif ( $study_score < 60 ) { $level = 'D';} else { $level = '未知';}switch ( $level ) { case 'A': $level_label = '優(yōu)秀'; break; case 'B': $level_label = '良好'; break; case 'C': $level_label = '及格'; break; case 'D': $level_label = '差'; break;}echo '學(xué)生 '.$study_name.' 的成績(jī)?yōu)?'. $study_score .',評(píng)級(jí)為:'.$level.'('. $level_label .')';die;
現(xiàn)在你在HTML頁(yè)面上輸入姓名和成績(jī),點(diǎn)擊按鈕“檢測(cè)評(píng)級(jí)”,會(huì)打開(kāi)一個(gè)新的頁(yè)面,這個(gè)頁(yè)面就是php文件的頁(yè)面,但是他是處理過(guò)我們提交的數(shù)據(jù)最后輸出內(nèi)容到頁(yè)面上來(lái)的。// 獲取用戶提交的學(xué)生名字和成績(jī)$study_name = isset($_GET['study_name']) ? $_GET['study_name'] : '';$study_score = isset($_GET['study_score']) ? $_GET['study_score'] : '';// 初始化評(píng)級(jí)$level = '未知';
php中聲明和定義變量使用 $ 美元符號(hào),后面緊跟著變量名稱,例如上面的 $study_name,$ 是php中聲明和定義變量的語(yǔ)法,study_name 是變量名,代碼通過(guò)變量名和計(jì)算機(jī)內(nèi)存地址相對(duì)應(yīng)進(jìn)行存儲(chǔ)和獲取變量值。同時(shí)變量有不同類型(描述的變量值的類型),比如常見(jiàn)的:字符類型:可以理解為字符或字符串,如 $var = 'string';整型:可以理解為整數(shù),包括正負(fù)數(shù)和0,都是整型,如 $var = 1; $var = -2;浮點(diǎn)型:可以理解為有小數(shù)的數(shù)字類型,如 $var = 1.12;布爾類型:可以理解為只有真、假兩個(gè)值,如 $var = true; $var = false;數(shù)組:是一種數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)多個(gè)不同的值,如 $var = array('我是值1', '我是值2', 5);對(duì)象:是一種數(shù)據(jù)結(jié)構(gòu),是類的實(shí)例,對(duì)象存儲(chǔ)了很多值,包括屬性變量、方法等(后面我們會(huì)專門(mén)講面向?qū)ο蟮臅r(shí)候講到對(duì)象)
3.3 比較運(yùn)算和數(shù)學(xué)運(yùn)算:第三點(diǎn),因?yàn)槲覀冃枰ㄟ^(guò)不同的分?jǐn)?shù)不同的條件來(lái)?yè)Q算出評(píng)級(jí),所以要進(jìn)行判斷和比較,比較運(yùn)算,顧名思義,就是要對(duì)多個(gè)值或變量進(jìn)行比較,必出大小、是否相等、是否不相等等,比較運(yùn)算的結(jié)果是布爾值,如$study_name == '' || $study_score == ''
其中符號(hào) || 是或者的意思,只要滿足其中任何一個(gè)條件就可以繼續(xù),符號(hào)在回車(chē)鍵上方,這個(gè)語(yǔ)句的意思就是:如果變量$study_name為空字符串或變量$study_score為空字符串的話就是真的;如果要兩個(gè)或多個(gè)條件同時(shí)滿足時(shí)用 && 符號(hào)連接。加法運(yùn)算:$a = 1 + 1; // 結(jié)果是 $a = 2減法運(yùn)算:$b = $a - 1; // 結(jié)果是 $b = 1乘法運(yùn)算:$c = $a * $b; // 結(jié)果是 $c = 2除法運(yùn)算:$d = 5 / $c; // 結(jié)果是 $d = 2.5取余/取模:$e = 5 % $c; // 結(jié)果是 $e = 1,就是余數(shù),如果除數(shù)是負(fù)數(shù),余數(shù)也是負(fù)數(shù)
3.4 分支語(yǔ)法,條件判斷 if...elseif...else...if ( $study_score >= 90 ) { $level = 'A';} elseif ( $study_score >= 80 && $study_score < 90 ) { $level = 'B';} elseif ( $study_score >= 60 && $study_score < 80 ) { $level = 'C';} elseif ( $study_score < 60 ) { $level = 'D';} else { $level = '未知';}
if...elseif...else...主要用于處理不同條件下,處理的方式或者變量的值不一樣的情況,就像找女朋友一樣,列了一堆條件,挨個(gè)去篩選,直到符合條件時(shí)就交往,不符合繼續(xù)找。主要結(jié)構(gòu)如上。條件明確時(shí),使用if或elseif+圓括號(hào),括號(hào)里面是條件,即比較運(yùn)算,當(dāng)結(jié)果是真(true)時(shí)就執(zhí)行對(duì)應(yīng)花括號(hào)里面的代碼。比如if ( 女孩身高 > 170 ) { echo "我要和她交往";} else { echo "孤獨(dú)終老";}
如果女孩的身高大于170cm,那就交往,否則拒絕交往(你可能要孤獨(dú)終老了)。當(dāng)只有一個(gè)明確條件,其他都不清楚的時(shí)候,中間是可以沒(méi)有elseif的,直接if...else...即可。switch ( $level ) { case 'A': $level_label = '優(yōu)秀'; break; case 'B': $level_label = '良好'; break; case 'C': $level_label = '及格'; break; case 'D': $level_label = '差'; break;}
switch常用于有多個(gè)分支并且有確定值分類比較簡(jiǎn)單值的時(shí)候,上述代碼時(shí)我們要對(duì)評(píng)級(jí)分別給予描述。基本語(yǔ)法結(jié)構(gòu)如上,下面也再做個(gè)解釋switch ( $level ) { // 分支關(guān)鍵字 switch 必須的,加圓括號(hào)和花括號(hào),圓括號(hào)里面是變量或者一個(gè)有明確計(jì)算結(jié)果的表達(dá)式 case 'A': // 每一個(gè)分支都用 case 值:來(lái)開(kāi)始 /*這里寫(xiě)代碼和業(yè)務(wù)邏輯*/ break; // 每一個(gè)分支處理完代碼業(yè)務(wù)邏輯,要跳出當(dāng)前分支 case 'B': $level_label = '良好'; break; case 'C': $level_label = '及格'; break; case 'D': $level_label = '差'; break;}
switch和if...else...在很多情況下是可以互相替代的,并且可以隨便嵌套,就是你中有我我中有你的這種感覺(jué),因?yàn)閟witch和if...else..本身也是組成代碼業(yè)務(wù)邏輯的一部分,當(dāng)然可以放在彼此懷(dai)里(ma)了(li)echo '學(xué)生 '.$study_name.' 的成績(jī)?yōu)?'. $study_score .',評(píng)級(jí)為:'.$level.'('. $level_label .')';die;
這里的代碼中我們使用了 echo 這個(gè)關(guān)鍵字(php語(yǔ)法,php中預(yù)留了一些自用的單詞),echo后面可以輸出非數(shù)據(jù)結(jié)構(gòu)類型的其他類型變量或值,比如,字符、數(shù)字(整型和浮點(diǎn)型)、布爾值等。而要輸出打印數(shù)組(array)、對(duì)象(object)則需要用到以下兩個(gè)函數(shù)print_r($array); // 通常用于數(shù)組打印var_dump($object); // 可以輸出打印所有類型,會(huì)有類型提示燈詳細(xì)信息print 'char'; // 與echo類似
常用的基本上就是我們以上者四種了,可以用來(lái)輸出內(nèi)容數(shù)據(jù)給用戶看,也可以用來(lái)進(jìn)行簡(jiǎn)單的代碼調(diào)試(作用很大)。// php中數(shù)組的定義如下// 使用array()來(lái)定義數(shù)組,數(shù)組的值也可以是數(shù)組// 有鍵名(如下面的name和score用來(lái)描述后面的值是什么樣的值)和值對(duì)的// 也有沒(méi)有鍵名只有值得,下面的值array('name' => '章五二', 'score' => 85)就是沒(méi)有鍵名的// 鍵名和值用符號(hào) => 連接,數(shù)組里的每一個(gè)項(xiàng)(值)后面用逗號(hào)(,)結(jié)束,最后一項(xiàng)可以不用// 數(shù)組只有一層(如 array(1,2,3))叫一維數(shù)組,有兩層(如下面的)叫二維數(shù)組,以此類推$score_arr = array( array('name' => '章五二', 'score' => 85), array('name' => '李小狗', 'score' => 65), array('name' => '孫兒了', 'score' => 99), array('name' => '韋小寶', 'score' => 59), array('name' => '任之初', 'score' => 88));// 或用短數(shù)組的方式來(lái)定義,就是中括號(hào) [] 代替 array(),在php5.4以上的版本支持了,如下$score_arr = [ ['name' => '章五二', 'score' => 85]];
那怎么獲取數(shù)組值呢?// 使用中括號(hào)和下標(biāo)來(lái)獲取,如[下標(biāo)],包括數(shù)字索引和鍵名索引兩種方式,鍵名存在的時(shí)候才可以使用鍵名// 例如,我要獲取章五二的成績(jī)就需要獲取數(shù)組$score_arr的第一個(gè)值// (數(shù)組的索引下標(biāo)從0開(kāi)始,第一個(gè)值下標(biāo)是0,第二個(gè)是1,以此類推)$score_arr[0]; // 這里獲取到的是第一個(gè)值,array('name' => '章五二', 'score' => 85)// 然后在獲取第一個(gè)值(也是數(shù)組)的score對(duì)應(yīng)的分?jǐn)?shù)值$score_arr[0]['score']; // 這里獲取的是第一個(gè)值的分?jǐn)?shù),你可以使用echo或者其他輸出方式,把她打印出來(lái)看看
現(xiàn)在數(shù)組有了,我們要進(jìn)行批量處理的時(shí)候,就可以采用循環(huán)的方式,數(shù)組循環(huán)我們通常用 foreach ( $score_arr as $key => $value ) { // 獲取每個(gè)人的成績(jī)并輸出 // 此時(shí)的 $value 就是數(shù)組的每一個(gè)值,從0(第一個(gè))開(kāi)始 // 如array('name' => '章五二', 'score' => 85) echo '學(xué)生 '. $value['name'] .' 的成績(jī)?yōu)?'. $value['score'] . '<br>';}// 不斷重復(fù)循環(huán)的去獲取成績(jī),輸出結(jié)果如下:/* 學(xué)生 章五二 的成績(jī)?yōu)?85 學(xué)生 李小狗 的成績(jī)?yōu)?65 學(xué)生 孫兒了 的成績(jī)?yōu)?99 學(xué)生 韋小寶 的成績(jī)?yōu)?59 學(xué)生 任之初 的成績(jī)?yōu)?88*/
還有兩個(gè)常用循環(huán)結(jié)構(gòu)for(初始值; 條件判斷表達(dá)式; 改變條件) { // 代碼邏輯 }// 和初始值while(條件判斷表達(dá)式) { // 代碼邏輯 改變條件}
注意有三要素:初始值、條件判斷、改變條件,同時(shí)注意for里面用的是分號(hào)而不是逗號(hào)。具體寫(xiě)法如下// 以從1加到100為例,你想說(shuō)首尾相加乘以50就好了,還要什么代碼執(zhí)行,哦豁,那么我們就用乘的吧// 從1乘到100,hiahiahia// $i不斷的變化,帶來(lái)了循環(huán)和循環(huán)結(jié)束的可能性,每一輪循環(huán),$i的值都在變化$total = 1; // 定義變量存儲(chǔ)最終結(jié)果for ($i=1; $i <= 100; $i++) { $total = $total * $i; // 當(dāng)對(duì)變量自身進(jìn)行數(shù)學(xué)運(yùn)算時(shí)可以簡(jiǎn)寫(xiě),如 $total *= $i;}// 或用 while$total = 1;$i = 1;while ($i <= 100) { $total *= $i; $i++;}// 補(bǔ)充說(shuō)明: $i++是自增1,同理$i--是自減1,同時(shí)符號(hào)放在前面也是可以的,結(jié)果一樣,如++$i、--$i// 但他們有所區(qū)別,你可以簡(jiǎn)單理解為,符號(hào)在前面的,是先運(yùn)算再使用,在后面的是先使用再運(yùn)算,比如$i = 1;$val = $i++; // $val = 1, $i = 2$i = 1;$val = ++$i; // $val = 2, $i =2// 好好體會(huì)一下
至此,你需要了解的PHP入門(mén)的基本語(yǔ)法就差不多了,你可以自己嘗試謝謝別的東西,比如模擬和用戶的對(duì)話,用戶選擇問(wèn)題提問(wèn),你針對(duì)問(wèn)題返回輸出不同的答案給用戶等等。Just try it~!恭喜你,真的入門(mén)了。如果你還不滿足,那么請(qǐng)接著往下看,以后我們都盡量用下面的知識(shí)來(lái)寫(xiě)php代碼哦。PHP 的真正威力源自于它的函數(shù)。在 PHP 中,提供了超過(guò) 1000 個(gè)內(nèi)建的函數(shù)。是不是聽(tīng)起來(lái)就有點(diǎn)炸。那么什么時(shí)候使用函數(shù)呢?一般要進(jìn)行重復(fù)使用同樣或類似的代碼的時(shí)候就需要用到函數(shù),函數(shù)來(lái)封裝這部分代碼,放在一處,處處可用,業(yè)務(wù)代碼更簡(jiǎn)潔了,還能少些代碼,同時(shí)功能解構(gòu)了,互不影響,多好,何樂(lè)而不為。
函數(shù)名(參數(shù))
函數(shù)名和變量名的命名規(guī)則一致,那參數(shù)是什么呢?var_dump('我就是參數(shù),值');
非常簡(jiǎn)單的去理解的話,參數(shù)就是函數(shù)調(diào)用的時(shí)候括號(hào)里面的東東,比如上面的 '我就是參數(shù),值',這整個(gè)就是參數(shù)。參數(shù)的作用就是將函數(shù)外部的變量、值等傳遞到函數(shù)內(nèi)部使用,參數(shù)也分實(shí)參和形參,作為入門(mén)理解,我們簡(jiǎn)單的理解為,實(shí)參是外部傳遞到函數(shù)內(nèi)部的時(shí)候的參數(shù),形參則是函數(shù)定義的時(shí)候,定義的參數(shù)列表。// 假裝我是源碼里面的函數(shù)聲明function var_dump($input) { // 這里是代碼邏輯實(shí)現(xiàn) }// 這里聲明了函數(shù)var_dump,括號(hào)里面的就是形參了,$input// 我們調(diào)用var_dump$input = 'i am the input string';var_dump($input);// 這里調(diào)用時(shí)候傳入的參數(shù)$input就可以理解為實(shí)參
由于php內(nèi)置了很多函數(shù),可以非常方便的使用,我們這里不詳細(xì)列舉,大家可以自己去了解下,后面我們用到的都會(huì)做對(duì)應(yīng)講解。function 函數(shù)名(參數(shù)1, 參數(shù)2, ...參數(shù)n) { 業(yè)務(wù)邏輯代碼}
函數(shù)定義五要素:關(guān)鍵字function、函數(shù)名、圓括號(hào)和參數(shù)、花括號(hào)、花括號(hào)內(nèi)的業(yè)務(wù)邏輯代碼。// 第一個(gè)需求$total_1 = 1;$i_1 = 1;while ($i_1 <= 100) { $total_1 *= $i_1; $i_1++;}// 第二個(gè)需求$total_2 = 2;$i_2 = 2;while ($i_2 <= 100) { $total_2 *= $i_2; $i_2 += 2;}
然后,需求又變了,增加一個(gè)從10開(kāi)始累乘每次自增10的值,不僅如此,還要把原來(lái)的從1開(kāi)始的改成從5開(kāi)始,(不要以為這樣的需求不會(huì)出現(xiàn),你以后干這一行你就會(huì)發(fā)現(xiàn),無(wú)處不在,產(chǎn)品的思維不是你我能夠理解的)如果按上面的寫(xiě)法,要繼續(xù)加代碼,并且很明顯的發(fā)現(xiàn),幾個(gè)需求的代碼幾乎是一樣的,只有兩個(gè)東西不一樣,這就很尷尬了,不斷寫(xiě)差不多的東西,修改的時(shí)候還得修改很多地方,比如從1開(kāi)始改成從5開(kāi)始累乘3,你需要修改的地方有哪些,你自己數(shù)數(shù)。// 按函數(shù)聲明的格式,我們寫(xiě)來(lái)個(gè)框架function multiply() {}
然后我們觀察需求發(fā)現(xiàn),經(jīng)常變動(dòng)的有兩個(gè)東西,一個(gè)是起始值,一個(gè)是自增值,那么這種變動(dòng)的東西,我們可以讓她以后作為參數(shù)傳到函數(shù)里面去。// 添加形參// $multiplicand 被乘數(shù)(起始值)// $increment 自增值function multiply($multiplicand, $increment) {}
然后就是把代碼邏輯放到函數(shù)體(花括號(hào)內(nèi)部分)內(nèi),使用參數(shù)來(lái)處理計(jì)算結(jié)果function multiply($multiplicand, $increment) { $total = $multiplicand; $i = $increment; while ($i <= 100) { $total *= $i; $i += $increment; }}
然后我們把結(jié)果從函數(shù)里面返回到函數(shù)外面,用 return 即可。function multiply($multiplicand, $increment) { $total = $multiplicand; $i = $increment; while ($i <= 100) { $total *= $i; $i += $increment; } return $total;}
這樣我們上面的代碼就可以變成/*function.php 專門(mén)放function函數(shù)的地方,也可以和業(yè)務(wù)代碼放在一起*/function multiply($multiplicand, $increment) { $total = $multiplicand; $i = $increment; while ($i <= 100) { $total *= $i; $i += $increment; } return $total;}/*code.php*/// 使用 require 來(lái)包含其他 php 代碼require 'function.php';echo multiply(1,1);echo multiply(2,2);
是不是看出來(lái),在具體業(yè)務(wù)代碼的code.php中,代碼更簡(jiǎn)潔了,而且封裝的函數(shù)multiply可以復(fù)用了。多好,多美好~!這里因?yàn)槔右?guī)模較小,優(yōu)勢(shì)可能你覺(jué)得沒(méi)那么明顯,慢慢等你長(zhǎng)(shen)大(ru)了會(huì)知道的,不著急,一個(gè)階段做一個(gè)事情嘛。在學(xué)校里,學(xué)生、老師是兩群不同的群體,簡(jiǎn)單說(shuō)就是兩類人,這個(gè)時(shí)候,學(xué)生是一類,老師是一類,這就是類此時(shí)此刻的你,我覺(jué)得應(yīng)該對(duì)類和對(duì)象以及對(duì)象的屬性、方法有了一定的了解了。還記得上面你想到的把不同方法歸類到不同文件嗎?這個(gè)時(shí)候,我們可以把一個(gè)類寫(xiě)到一個(gè)文件,然后類里面有不同的方法,這樣只要類名不同,我們的方法同名也不要緊,因?yàn)槲覀兪褂妙惖膶?duì)象去調(diào)用的方法,每一個(gè)對(duì)象實(shí)例那都是不是同一個(gè)的。
在學(xué)生或老師的某一類里,每一個(gè)學(xué)生或老師,都是各自群體里的某一個(gè)個(gè)例,或者叫實(shí)際的例子,簡(jiǎn)稱實(shí)例(話糙理不糙),比如張五、孫三,都是不一樣的個(gè)體實(shí)例,我們就這叫實(shí)例化的對(duì)象,也就是類(學(xué)生群體)的對(duì)象(個(gè)體實(shí)例)
想想看,張五、孫三這兩都有些什么共同的靜態(tài)的東西,就是你有我也有的那種?想到了嗎?沒(méi)想到?不會(huì)吧~!身高?體重?是不是?腰圍、胸圍、臀圍是不是?當(dāng)然都是啊~!我們把這些稱為對(duì)象的屬性
張五、孫三除了有共同的靜態(tài)的特征,還有一些共同的動(dòng)態(tài)的東西,比如吃,比如喝,還有拉撒等,這些我們都可以稱為對(duì)象的方法
<?php/** * Student.php * 這是一個(gè)學(xué)生類,類名 Student和文件名Student一致 * 方便讀懂和找類的時(shí)候更容易找到和區(qū)分 *//** * 類聲明的基本形式如下 * class 類名 {} */class Student {}
學(xué)生這一類人有哪些屬性(特征)和方法(動(dòng)作、能力)呢?<?php/** * Student.php * 這是一個(gè)學(xué)生類,類名 Student和文件名Student一致 * 方便讀懂和找類的時(shí)候更容易找到和區(qū)分 *//** * 類聲明的基本形式如下 * class 類名 {} */class Student { // 身高 public $height; // 體重 public $weight; /** * 吃 */ public function eat() { echo 'I am eatting~!'; } /** * 喝 */ public function drink() { echo 'Drinking too much~!'; }}
就這樣,我們寫(xiě)了一個(gè)擁有兩個(gè)方法(類里面的函數(shù)我們通常稱為方法)和兩個(gè)屬性的學(xué)生類。有沒(méi)有發(fā)現(xiàn),類方法的聲明和函數(shù)的幾乎是一致的,而類屬性和變量的聲明也幾乎是一樣的。區(qū)別在哪里呢?你們都是明眼人,一看就知道多了個(gè) public,這個(gè)關(guān)鍵字,和protected、private,并稱類屬性或方法的訪問(wèn)類型,也就簡(jiǎn)單的描述了屬性和方法的訪問(wèn)限制<?php/** * class.php */// 包含類文件,也就包含了類require 'Student.php';// 實(shí)例化類,使用 new 類名() 的方式// 這樣就得到了一個(gè)學(xué)生類Student的對(duì)象 $student$student = new Student();// 使用對(duì)象->的方式訪問(wèn)類的屬性和方法var_dump($student->height);$student->eat();
既然講到繼承了,我們就繼續(xù)講一講,繼承作為類的一大特性之一,能夠解決更多的代碼耦合的問(wèn)題,比如同樣是學(xué)生,男同學(xué)和女同學(xué)在吃上面也是不一樣的,男同學(xué)吃飯量大且大口朵頤,女同學(xué)量小還溫柔細(xì)嚼慢咽。這個(gè)時(shí)候,如果我們?cè)趯W(xué)生類的方法吃里面進(jìn)行男女生判斷再執(zhí)行不同的操作,如下<?php/** * Student.php * 這是一個(gè)學(xué)生類,類名 Student和文件名Student一致 * 方便讀懂和找類的時(shí)候更容易找到和區(qū)分 *//** * 類聲明的基本形式如下 * class 類名 {} */class Student { // 身高 public $height; // 體重 public $weight; // 性別 public $sex; /** * 每個(gè)類都可以聲明定義一個(gè)構(gòu)造函數(shù) * 構(gòu)造函數(shù)在實(shí)例化的時(shí)候就會(huì)調(diào)用 * 也就是比其他方法會(huì)先調(diào)用 * 可以接受參數(shù) */ public function __construct($sex) { // 在類內(nèi)部使用 $this 來(lái)訪問(wèn)屬性和方法 // 訪問(wèn)類屬性和方法時(shí)的使用方法時(shí):$類對(duì)象名->屬性或方法,例如下面 $this->sex = $sex; // 把傳進(jìn)來(lái)的性別參數(shù)賦值給類的sex屬性 } /** * 吃 */ public function eat() { // 根據(jù)性別不同來(lái)判斷吃相 if ( $this->sex == '男' ) { echo '吃得很香,大口朵頤,毫無(wú)人性'; } elseif ( $this->sex == '女' ) { echo '哇,溫柔的細(xì)嚼慢咽,好美的畫(huà)面'; } else { echo '夾起,塞嘴里,嚼碎,吞咽'; } } /** * 喝 */ public function drink() { echo 'Drinking too much~!'; }}
突然,需求變了,不是男女來(lái)區(qū)分吃的方法方式了,而是年級(jí)來(lái)分,一年級(jí)的這么吃,二年級(jí)的那么吃...去改代碼去吧,不僅要去掉先前的代碼,還要新增別的代碼,并且,萬(wàn)一原來(lái)別的地方使用了男、女吃的方法,那可怎么辦,隱患真大,所以我們偉大的先人們發(fā)明了類繼承<?php/** * Student.php * 這是一個(gè)學(xué)生類,類名 Student和文件名Student一致 * 方便讀懂和找類的時(shí)候更容易找到和區(qū)分 *//** * 類聲明的基本形式如下 * class 類名 {} */class Student { // 身高 public $height; // 體重 public $weight; /** * 吃 */ public function eat() { echo 'I am eatting~!'; } /** * 喝 */ public function drink() { echo 'Drinking too much~!'; }}
然后新建男學(xué)生類和女學(xué)生類(php里面類的繼承是只能繼承一個(gè)父類的)<?phprequire 'Student.php';/** * StudentBoy.php * 男學(xué)生類 * 繼承學(xué)生類,也就繼承了學(xué)生類的所有非私有(private)的屬性和方法 */class StudentBoy extends Student {}
<?phprequire 'Student.php';/** * StudentGirl.php * 女學(xué)生類 * 繼承學(xué)生類,也就繼承了學(xué)生類的所有非私有(private)的屬性和方法 */class StudentGirl extends Student {}
使用關(guān)鍵字 extends 來(lái)繼承類,這樣,啥也不用寫(xiě)啥也不用干,就擁有了學(xué)生類的所有非私有(private)屬性和方法。<?php/** * class.php */// 包含類文件,也就包含了類require 'StudentBoy.php';// 實(shí)例化男學(xué)生類對(duì)象,雖然男學(xué)生類沒(méi)有eat方法,但是繼承了學(xué)生類,也繼承了學(xué)生類的eat方法$boy = new StudentBoy();$boy->eat();
那么繼承有了,我們?cè)趺床拍軌驅(qū)崿F(xiàn)不同的性別或年級(jí)來(lái)執(zhí)行不同的吃法呢?沒(méi)錯(cuò)~?。ㄟ_(dá)叔好久不加你...)就是一個(gè)叫子類重寫(xiě)父類成員方法的方式,也叫覆蓋、覆寫(xiě)。很簡(jiǎn)單,就是在子類里面重新定義或聲明一遍父類的某個(gè)方法,這樣一來(lái),你實(shí)例化子類對(duì)象的時(shí)候,調(diào)用該方法,就會(huì)調(diào)用子類里面的,那些沒(méi)有重寫(xiě)父類方法和父類本身的類,依舊可以輕松調(diào)用父類的該方法,互不影響,實(shí)現(xiàn)解構(gòu),解耦。<?phprequire 'Student.php';/** * StudentBoy.php * 男學(xué)生類 * 繼承學(xué)生類,也就繼承了學(xué)生類的所有非私有(private)的屬性和方法 */class StudentBoy extends Student { // 重寫(xiě)父類eat方法 public function eat() { echo '吃得很香,大口朵頤,毫無(wú)人性'; }}
<?phprequire 'Student.php';/** * StudentGirl.php * 女學(xué)生類 * 繼承學(xué)生類,也就繼承了學(xué)生類的所有非私有(private)的屬性和方法 */class StudentGirl extends Student { // 重寫(xiě)父類eat方法 public function eat() { echo '哇,溫柔的細(xì)嚼慢咽,好美的畫(huà)面'; }}
就非常方便的能擴(kuò)展了,并且任何一個(gè)類修改將不影響父類,父類修改也不影響子類,新增多少個(gè)年級(jí)的吃法都是新增某個(gè)年級(jí)的類,然后重寫(xiě)父類的方法即可。關(guān)鍵詞:入門(mén)
客戶&案例
營(yíng)銷(xiāo)資訊
關(guān)于我們
客戶&案例
營(yíng)銷(xiāo)資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。