Web服務器的做用:接收客戶端(PC/PAD/PHONE)的請求,查找須要的數據(文件/數據庫/其它系統),發送回客戶端。
Web服務器分爲兩種:
(1)靜態Web服務器:提供的內容任何人任什麼時候間都是不變的php
靜態Web內容:HTML/CSS/JS/Flash/GIF/音視頻... 常見的靜態Web服務器:Apache Httpd、MS IIS、NginX
(2)動態Web服務器:提供的內容不一樣人不一樣時間均可能變化mysql
動態Web內容: JSP = HTML + Java(靜態Web服務器+Java解釋器) PHP = HTML + PHP(靜態Web服務器+PHP解釋器) ASP.NET = HTML + C#(靜態Web服務器+C#解釋器) Node.js = HTML + Node
PHP:Personal Home Page => PHP is Hypertext Preprocessor(Zend)
LAMP組合 = Linux + ApacheHttpd + MySQL + PHP程序員
(1)服務器端:下載並安裝一款靜態Web服務器面試
c:/xampp/apache/bin/httpd.exe
(2)服務器端:下載並安裝PHP解釋器,與Web服務器整合算法
C:/xampp/php/php.exe
(3)服務器端:編寫靜態/動態網頁,保存在Web服務器上sql
C:/xampp/htdocs
(4)服務器端:啓動Web服務器,打開須要的端口數據庫
ApacheHttpd服務器默認佔用80/443端口
-------------------------------------------
(5)客戶端:在瀏覽器中輸入協議、地址、端口訪問Web服務器apache
http://127.0.0.1:80
a = 1; b = 2; c = a + b;
變量:值可能發生改變的量,如人的年齡、用戶的密碼、商品的價格。後端
PHP中聲明一個變量: $變量名 = 值; #等號讀做「賦值」 輸出一個變量的值: echo $變量名; #輸出變量值時不加單引號
常量:值不可能發生改變的量,如PI、E。數組
聲明一個常量: const 常量名 = 值; 輸出一個常量值: echo 常量名;
變量名中能夠包含數字、字母、下劃線,但不能以數字開頭
合法的:$age、$age二、$_age_二、$emp_age、$empAge
非法的:$2age、$user-Name、$user Name
常量名中能夠包含數字、字母、下劃線,但不能以數字開頭;習慣上常量名所有使用大寫字符
合法的:AGE、AGE二、EMP_AGE
PHP/JS屬於「弱類型語言」—— 建立變量時無需指定類型,一個變量能夠前後賦值爲不一樣類型的值
$i = 10; $i = 'Hello'; $i = true;
echo $變量名; 只能用於輸出變量的值;
var_dump($變量名); 可用於輸出變量的類型和值。
PHP中的數據類型——具體能夠查看參考手冊《語言參考》:
1)4個標量/值/基礎類型
(1)int/integer:整數 -2147483648~2147483647 (2)float/double:小數 float和double徹底同樣 (3)string:字符串 (4)bool/boolean:布爾,只能取值爲true / false / TRUE / FALSE
2)2個複合類型
(5)array:數組 (6)object:對象
3)2個其它類型
(7)null:空 (8)resource:資源
注意:
(1)整數值超過了int的最大範圍(2147483647),自動變爲flaot類型
(2)bool的true若用echo輸出爲'1',false用echo輸出爲空字符串
(3)string可用單引號/雙引號括起來;細微的區別:若單引號字符串中有變量名,則直接輸出爲變量名;而雙引號中的有變量名,則輸出爲變量的值 —— 雙引號中不具有運算能力:"$a+$b"
(4)兩個字符串拼接使用 . 號
PHP中的運算符分爲以下的幾大類:
(1)算術運算符: + - * / % ++ --
(2)比較運算符: > < ...
(3)邏輯運算符: && || !
(4)位運算符: << >>
(5)賦值運算符: = ....
(6)拼接運算符: .
(7)三目運算符: ?:
3.算術運算符
說明:
(1)+只用做算術運算,不用作字符串拼接!
(2)+做用於字符串,會發生隱式轉換:試着解析出字符串中的數字,能解析幾位就解析幾位。
(3)+做用於布爾,會發生隱式轉換:true轉換爲1,false轉化爲0。
(4)%表示求餘運算/取模運算,2018%4結果爲2,通常用於斷定一個數是否能被另外一個數整除
(5)計算一個數字在原有基礎上+1,有三種方法:
$n1 = $n1 + 1; $n1 ++; #運算速度更快! ++ $n1;
4.比較運算符
= < <= == != ===(全等於) !==(不全等)
說明: $result = $score1 > $score2;
(1)比較運算的結果爲 true 或 false 。
(2)默認狀況下,用==比較的話,1和true是相等的;0和false和""是相等的 —— ==運算符會進行自動的「隱式轉換」。
(3)若比較運算中不但願出現自動的隱式轉換,只要類型不一樣直接斷定爲不等使用 ===
5.邏輯運算符
&&(而且/與) ||(或) !(取反/非)
$c = 50; $m = 80;
斷定語文和數學是否都及格了: $c>=60 && $m>=60
對於&&運算:
true && true => true
false && true => false
true && false => false
false && false => false
斷定語文和數學有一科及格嗎: $c>=60 || $m>=60
對於||運算:
true || true => true
false || true => true
true || false => true
false || false => false
斷定語文是否爲不及格: !($c>=60)
對於!運算:
! true => false
! false => true
與運算中的「短路」效果:
false && ? => false ?將不會被執行
或運算中的「短路」效果:
true || ? => true ?將不會被執行
數字按照二進制(bit位)形式進行運算。
<<(按位左移) >>(按位右移)
面試題:如今有變量 $num = 5,計算出$num*16的最快方式是:
(a) $num = $num * 16;
(b) $num *= 16;
(c) $num *= 4;
(d) $num << 4;
(e) $num << 16;
結論:一個數字向左按位移動N位,至關於 原數*2^N;
一個數字向右按位移動N位,至關於 原數/2^N;
= += -= *= /= %=
$n = 30;
$n = $n + 5;
$n += 5; //效果等價於上一行
$n = $n - 5;
$n -= 5; //效果等價於上一行
. .=
$uname = 'tom';
$uname = $uname . '先生';
$uname .= '先生'; //效果等價於上一行
單目運算符: $a++
雙目運算符: $a + $b
三目運算符: $a ? $b : $c
?:
語法: 表達式1 ? 表達式2 : 表達式3
含義:(若是...不然...)若是表達式1的值爲true,則返回表達式2的值,不然返回表達式3的值
示例: $sex = 1;
$result = $sex===0 ? '女' : '男' ; echo $result;
1.算法的基本結構
(1)順序執行
(2)選擇執行
(3)循環執行
2.程序邏輯結構 —— 順序執行
3.程序邏輯結構—— 選擇/分支執行之一
收銀臺程序 V2.0: 若購物總金額滿500,則打八折
選擇執行的最基礎代碼:
if( 條件斷定 ){ //條件斷定結果爲true時執行的代碼 }
語句1;
if( 條件斷定 ){
語句2;
}
語句3;
若是條件斷定爲true,執行順序: 1=>2=>3
若是條件斷定爲false,執行順序: 1=>3
收銀臺程序 V3.0: 若已付金額足夠商品總價格,計算找零並輸出;不然輸出錯誤提示
"若是...不然..."邏輯的語法結構:
if( 條件斷定 ){ //條件斷定爲true時執行的語句 }else { //條件斷定爲false時執行的語句 }
語句1;
if( 條件斷定 ){
語句2;
}else {
語句3;
}
語句4;
條件斷定爲true,執行順序: 1=>2=>4
條件斷定爲false,執行順序: 1=>3=>4
關於"if...else....的嵌套問題"有兩種編寫方法:
(1) if( ){
}else { if(){ }else { } }
(2) if( ){
}else if( ){ }else if( ){ }else { }
if1 + else ifN + else*1
小結:
(1) if( ){ }
(2) if( ){ }else{ }
(3) if( ){ }else{ if(){}else{} }
(4) if( ){ }else if( ){ }... else{ }
4.程序邏輯結構—— 選擇/分支執行之二
switch...case...break選擇分支結構:在多個不一樣「情形下」進行「切換」。
語法: switch( 變量名 ){
case 值1: #if(變量名==值1) 語句1; case 值2: #if(變量名==值2) 語句2; .... default: #else.... 語句n; }
含義:若指定變量等於值1,則執行語句1;不然若等於值2,則執行語句2.... 不然執行語句n。
注意:默認狀況下,switch若斷定了某個相等條件則執行該條件以及後續全部條件中的執行語句 —— 必須配合break關鍵字使用。
5.程序邏輯結構 —— 循環結構之一
循環:屢次執行相同或類似的代碼
循環二要素: (1)循環體 (2)循環條件
第一種循環結構:
while( 循環條件斷定 ){ //循環體 }
含義:執行條件斷定,若爲true,則執行一次循環體;再次執行條件斷定.....直到某次執行完循環體,再去執行條件斷定爲false,則退出循環,繼續執行後面的語句
語法:
do{ 循環主體; }while( 循環條件 );
while...先斷定後執行 do..while..先執行再斷定
$i=0;
while($i<5){
echo 'Hello'; $i++;
} $i=0;
do{
echo 'Hello'; $i++;
} while($i<5);
$i=10;
while($i<5){
echo 'Hello'; $i++;
} $i=10;
do{
echo 'Hello'; $i++;
} while($i<5);
while循環主體可能執行0~N次 do..while循環主體可能執行1~N次
語法:
for( 表達式1 ; 表達式2 ; 表達式3 ){ 循環主體; }
含義:首先執行且僅執行一次「表達式1」;
再執行「表達式2」的斷定,若爲true,執行一次循環主體; 再執行一次「表達式3」,再去執行「表達式2」的斷定, 若爲true繼續執行一次循環主體..... 直到爲false,退出循環。
總結:
「表達式1」在循環開始前執行一次——通常用於聲明循環變量;
「表達式2」在每次主體執行前都執行一次——通常用於執行循環斷定條件;
「表達式3」在每次主體執行後都執行一次——通常用於執行循環變量的增減。
$i = 0;
while( $i<5 ){
echo 'Hello';
$i++;
} for( $i=0; $i<5; $i++){
echo 'Hello';
}
while和for的功能同樣!只是for更加緊湊!
for循環中的三個表達式均可覺得空。
循環中使用break關鍵字: 打斷當前循環,再也不執行,跳出循環
for($i=1; $i<10; $i++){
if($i==5){
break;
}
echo "$i";
}
//1/2/3/4
while(true){ ...break;... } for( ; ; ){ ...break;... }
循環中使用continue關鍵字:跳過這次循環,繼續下一次循環
for($i=1; $i<10; $i++){
if($i==5){
continue;
}
echo "$i";
}
//1/2/3/4/6/7/8/9
表示一個學生的成績: $score = 90; #一個標量便可
表示100個學生的成績:
$score1 = 85; $score2 = 98; $score3 = 77; ....
結論:一個標量類型的變量只能存儲一個數據;若想一個變量中存儲N個值,可使用複合類型「數組(Array)」
建立一個數組的語法:
$變量名 = [ 值1, 值2, .... 值n ]; $變量名 = [ ];
獲取數組中元素的個數/數組的長度:
echo count($變量名);
操做數組中的某個元素——使用元素的下標/索引(index):
$變量名[下標] = 值; #修改指定下標處的元素值 echo $變量名[下標]; #輸出指定下標處的元素值
向數組中添加新元素:
$變量名[ ] = 值; #新的元素會自動獲取新的下標
思考:建立一個數組,保存一個學子商城中用戶的信息,編號、用戶名、密碼、註冊時間、當前是否在線。
$user = [134773434, 'tom', '1232132', 123434434, 1];
0 1 2 3 4
數據的說明性太差了!
(1)索引數組(Indexed Array):每一個元素的下標是數字
$arr = ['tom', 'mary', 'king']; $arr = [24, 35, 55, 28, 29]; 索引數組適用於「類型相同的多個數據」
(2)關聯數組(Association Array):每一個元素的下標是字符串
$user = ['uid' =>1234, 'uname'=>'tom', 'regTime'=>1232341343, 'upwd'=>'123234'];
注意:關聯數組每一個元素的下標都是自定義的字符串!不能使用for循環進行遍歷!
語法: foreach只用於遍歷數組(尤爲是關聯數組)
foreach( $數組名 as $元素變量名 ){ //循環主體 } foreach( $數組名 as $下標變量名=>$元素變量名 ){ //循環主體 }
含義:對於數組中的每一個元素,都看作是一個指定的變量,對每一個這樣的變量執行一次指定的循環體
示例: $ageList = [20, 23, 21, 25];
foreach( $ageList as $v){ echo "$v<br>"; } ================== $user = ['uid'=>101, 'uname'=>'tom']; foreach( $user as $v){ echo "$v<br>"; }
預約義:由PHP解釋器本身建立的,程序員不須要聲明能夠直接使用的。PHP預約義了以下的數組變量:
$_GET
$_POST
$_COOKIE
$_FILES
$_REQUEST:保存着客戶端提交給服務器的「請求」數據
$_SESSION
上述變量默認都是 array(0){ }
Web項目中,客戶端(瀏覽器)如何給服務器傳數據:
http://127.0.0.1/login.php?uname=tom&upwd=123
PHP服務器會自動把?後面的數據存儲到$_REQUEST數組中:
$_REQUEST['uname'] = 'tom'; $_REQUEST['upwd'] = '123';
程序員如何讀取客戶端提交的數據:
echo $_REQUEST['uname']; //tom echo $_REQUEST['upwd']; //123
Function:功能體/函數,用於封裝一段須要反覆執行/不易編寫的代碼 —— 餃子機。
聲明一個函數:
function 函數名( ){ //函數主體 }
執行/調用一個函數:
函數名( );
聲明一個帶參數的函數:
function 函數名(參數名1, 參數名2, ... ){ //函數主體 }
執行/調用一個函數:
函數名( 值1, 值2, ... );
聲明函數時指定的參數其實就是變量名——形式參數;調用函數時給出指定的具體的值——實際參數。
聲明一個帶返回值的函數:
function 函數名( [參數名1, 參數名2, ...] ){ //函數主體 return 函數運算的結果值; //應該是整個函數中最後一句 }
執行/調用一個有返回值函數:
$變量名 = 函數名( [值1, 值2, ...] );
使用一個變量接收函數的返回值。
提示:歷史上,PHP官方提供了兩套訪問MySQL服務器的函數:
mysql_xxxx( ) 性能不夠優秀 mysqli_xxxx( ) Improved:改進提高版
使用MySQLI函數庫訪問數據庫服務器的步驟(與管理員從命令行中訪問數據庫的步驟同樣):
(1)鏈接到數據庫服務器
$conn = mysqli_connect(...);
(2)提交SQL語句給服務器執行
$sql = "INSERT/DELETE/UPDATE/SELECT..."; $result = mysqli_query($conn, $sql);
(3)查看執行結果
if($result===false){ //執行失敗 }else{ //執行成功 }
(4)關閉到數據庫服務器的鏈接(能夠省略)
mysqli_close( $conn );
$i++:先取值再自加++$i:先自加再取值 $i = 10;$j = $i++; #先取出$i的值(10),賦值給$j;而後$i自加1echo $i, $j; #11, 10$i = 10;$j = ++$i; #先對$i自加1,變爲11;再取其值賦給$j(11)echo $i, $j; #11, 11