细说php入门学习
文章目錄
- 1. php基本語法
- 2. 變量
- 3. 數據類型
- (1). 整型 interger
- (2). 浮點型 float
- (3). 布爾型 boolean
- (4) 字符串 string
- (5). 數組 array
- (7). 對象 boject
- (8). 資源 resource
- (9). 空null
- 4. 常見函數以及基本語法
- (1). 三種常見函數
- (2). 四種常見輸出
- (3). 自動類型轉換
- (4) .強制類型轉換
- (5) . 常量
- (7). 運算符
- 5.流程控制
- (1) 分支結構 if / switch
- (2). 循環結構
- 1.while循環結構
- 2.doWhile 循環
- 4.for循環
- 5.混合寫法:
- 6.多重循環
- 7.流程控制符
- 6. 函數function
- (1).函數命名規范
- (2) . 函數返回值
- (3). 參數
- (4). 變量作用域
- (5). 靜態變量
- (6). 自定義函數
- 7. 數組 array
- (1).定義格式:
- (2).遍歷數組
- (3). 指針函數
- (4). 預定義數組
- 8. 正則
- 9. 時間
- 10. 錯誤
- (1) 錯誤的三種領域
- (2).錯誤級別
- (3). 屏蔽錯誤
- (4). 自定義報錯
- (5). 邏輯錯誤
- 11. 文件
- (1) 文件屬性: 常見分類
- (2) 文件分類
- (3). 文件路徑
- (4)文件-目錄-操作
- (5) . 文件加載
- (6) 遞歸函數
- (7) 文件內容 文件操作
- (8) 接收上傳內的文件
- (9) 驗證
- (10) 高頻率 uuid 設置唯一的id
- (11) 文件下載
- 12 .面向對象
- (1) 對象
- (2) 偽對象 $this
- (3) 連貫操作 OOP
- (4)魔術方法
- (5) PDO 操作數據庫 ( 數據庫抽象層 )
1. php基本語法
php 服務器語言
- 服務器: Apache服務器
- PHP文件: 存放wamp/www目錄
訪問方式
-
只能通過瀏覽器訪問,訪問地址**: lcoalhost**
-
代表訪問本地服務器
PHP是什么?
-
超文本預處理器
-
一句話: 一種用來開發動態網站的服務器腳本語言
PHP文件
- 格式: ***.php
定界符
- <?php php代碼 ?>
注釋
-
// 單行
-
#單行
-
/* 多行 */
設置編碼
- header( 'content-type: text/html; charset-編碼 ')
PHP基本語法
-
每一條PHP命令均已分號結尾.發表該php命令結束其中,最后一條命令可以省略分號,推薦加上分號
-
php報錯 不是當前行 就是上一行
2. 變量
含義: 變量理解為數學中的未知數
聲明變量:
-
格式: $變量名=值
-
內存: 一旦申明一個變量,就會占用一定的內存
+ 注意點: 若變量沒有值,則被稱之為未定義變量,該變量會報錯.
+ 當程序結束,沒有人在引用變量時,就會被刪除
變量命名規范
- 有數字,字母和下劃線組成
- 不能以數字開頭
- 支持中文., 但不推薦
- 變量名要有意義
可變變量
- 將一個變量的值,作為另一個變量名來使用
引用變量值:
傳值
$a = 100; $b = $a; $b = 200; echo $a,$b 這時,$a=100 $b=200; 傳的是值所以$a不改變傳址 &
$a = 100; $b = &$a; $b = 200; echo $a,$b 這時,$a=200 $b=200; 傳的是址所以$a改變3. 數據類型
| int | 整型 |
| float | 浮點型 |
| bool | 布爾型 |
| string | 字符串 |
| 2. 復合類型 | |
| array | 數組 |
| boject | 對象 |
| 3. 特殊類型 | |
| resource | 資源 |
| nul | 空 |
| is_string ( 變量) | 判斷是否為字符串 |
| is_numeric( 變量) | 判斷是否為數字字符串 |
| is_scalar( 變量) | 判斷是否為標量 |
| is_int( 變量 ) | 判斷是否為整型 |
| is_float(變量) | 判斷是否為浮點型 |
| is_array( 變量) | 判斷是否為數組 |
| is_object( 變量) | 判斷是否為對象 |
| is_resource( 變量) | 判斷是否為資源 |
(1). 整型 interger
最大整型: PHP_INT_MAX 超過最大整型轉為浮點型.
| 二進制 | 0-1 | 0b |
| 八進制 | 0-7 | 0 |
| 十進制 | 0-9 | 無 |
| 十六進制 | 0-9 a-f | 0x |
進制轉換:
任意進制—> 十進制:
基數 * 進制 ^ 次方
十進制—> 轉任意進制
將十進制除以 任意進制, 結果到倒取余
(2). 浮點型 float
浮點型:
-
小數
-
科學計數法 2e3 2e4 …3*10 的3次方…
-
浮點數不適合做運算
-
有效位數: 從前向后,第一個非0數字開頭, 向后保留14位.
(3). 布爾型 boolean
布爾型 bool 的值:
-
true 對,肯定.是,1,可以…
-
false 錯,否認,否,0,不可以…
-
作用: 當運算不能直接表達, 一般會使用bool來表達狀態
| false |
| 0 |
| 0.0 |
| ‘’ , ‘0’ |
| null |
| 空數組 |
| 未定義的變量 |
(4) 字符串 string
格式:
單雙引號 : 單雙引號的共同特性: ( 單雙引號可以互插,不能自插. )
單引號:
-
不解析變量
-
不解析轉義字符,但解析轉義轉義字符.
+ 轉義符: \ + 常見轉義: \n 換行 \r 回車 \t 制表符 Tab + 轉義 轉義字符+ \' 普通單引號+ \" 普通雙引號+ \\ 普通斜杠+ \$ 普通$符,不再有變量聲明的意義了?
- 解析變量 變量最好用{}包起來
- 解析轉義字符
?
heredoc結構
$a = <<<xxoo輸出多行文字或者什么的時候的是可以利用heredoc排版<table><caption></caption><tr></tr></table> xxoo;(5). 數組 array
定義: 容器,可以容納任意數據
聲明:
組成:
數組是由鍵和值 組成
數組的鍵: int 或者 string
? 鍵的別名: 偏移量 下標 索引
數組的值: 任意類型的值
操作數組:
- 讀取: 通過鍵來讀取數組的值
- 修改: 通過已有的鍵 來修改數組的值
- 新增: 通過沒有的鍵 來新增數組的值
- 刪除: 通過unset( )函數來刪除值
(7). 對象 boject
一切皆對象
簡單獲取一個對象
$obj = new stdclass;
var_dump($obj);
(8). 資源 resource
任何文件都是資源
簡單獲取一個資源
fopen( 文件路徑, 文件打開方式 r 只讀 w寫入)
(9). 空null
4. 常見函數以及基本語法
(1). 三種常見函數
在PHP中: 如果只是為了輸出一句話
? <?php echo 內容 ?> 簡化為 <?= 內容 ?>
| empty(變量 ) | 判斷一個變量是否為空( 只要與false等價,都為空) | 空 => true // 非空 => false |
| isset(變量 ) | 判斷一個變量是否設置, (只有null 和 未定義變量是沒有設置過的) | 設置 => true // 未設置=> false |
| unset(變量 ) | 刪除變量, 從而釋放內存 | 返回值: 無 |
內存 注意點:
(2). 四種常見輸出
echo
- 支持intfloat, string, resource 的輸出
- 屬于 語法結構, 不是函數
print 或 print( )
-
支持int,float,string,resource的輸出
-
print 語法結構
-
print( ) 函數
? 返回值: int
print_r( );
- 除了bool 和null 不能輸出,其余都可以輸出
- 函數,返回值:bool
- 輸出理論無限制,實際受限于內存
var_dump
- 支持 任意類型
- 函數,返回值:無
- 輸出有上限
小結:
? print_r 適合大批量數據輸出
? var_dump 僅僅用于測試, 信息全面(文件地址,行高,數據類型,值,長度)
(3). 自動類型轉換
-
弱類型語言: 支持隱式轉換
-
強類型語言: 不支持隱式轉換
-
隱式轉換: 偷偷將數據類型 進行轉換
-
PHP 屬于 弱類型語言
(4) .強制類型轉換
臨時轉換
只是暫時將變量類型轉為其他類型,但本聲不變.
| (bool)$str | 布爾型 |
| (int)$str | 整型 |
| (float)$str | 浮點數 |
| (string)$str | 字符串 |
| (array)$str | 數組 |
| (object)$str | 對象 |
| 函數強制轉換 | |
| intval($str) | 整型 |
| floatval($str) | 浮點型 |
| boolval($str) | 浮點型 |
| strval($str) | 字符串 |
永久轉換
settype ( 變量 , 類型 )
(5) . 常量
經常不變化的量,即為常量.
注意點:
格式: const 常量名 = 常量值
格式: define ( 常量名, 常量值 , bool ) bool值確認是否區分大小寫.
預定義常量
| PHP_INT_MAX | 最大整型數 |
| M_PI | 圓周率 |
| PHP_OS | 當前PHP所在系統 |
| PHP_VERSION | 當前PHP版本 |
魔術常量
| __DIR__ | 獲取當前文件的所在目錄 |
| __FILE__ | 獲取當前文件的盤符路徑 |
| __LINE__ | 獲取當前行號 |
(7). 運算符
算數運算符
+ - * / % 加減乘除取余.
余數 % 除了求余之外,還有2種特殊功能
余數的正負: 取決于 第一位的正負
取余的范圍: %x 結果: [ 0 ,x )
結果范圍 x ~ y0 ~ y-x %(y-x+1)+x------------------x ~ y 結果: %(y-x+1) + x 求奇偶數 余數為0 即為偶數余數為1 即為奇數結束范圍: 0~1%2 1. 求任意數字的 個位數 0 ~ 9$a = 123;var_dump( $a % 10 ); 10的1次方2. 求任意數字的 最后兩位 00 ~ 99$a = 123;var_dump( $a % 100 ); 10的2次方3. 求任意數字的 最后n為 %10的n次方自增\自減
-
? ++ 變量a 自己給自己+1
a++ 先返回a 在給a+1
++a 先給a+1 在返回a -
? – 變量自己給自己-1
a-- 同上
–a 同上
字符串拼接
-
拼接符 . 小數點
-
主要用于:
- 字符串.變量
- 變量.字符串
- 變量.變量
-
單引號的速度 比 雙引號的塊
-
為了整個項目的運行速度考慮:
-
? 如果變量較少,推薦用單引號,變量用拼接
-
? 如果變量較多,使用雙引號,變量用{} 包起來
賦值運算符
| = | 將 = 右邊的 賦給 左邊的 |
| += | a += b ==> a = a + b |
| -= | 同上 |
| *= | 同上 |
| /= | 同上 |
| %= | a .= b ==> a = a . b |
比較運算符
| > >= | 大于 大于等于 |
| < <= | 小于 小于等于 |
| == | 判斷兩邊的值是否相等 |
| === | 全等: 判斷兩邊的值是否相等 且 數據類型相等 |
| != | 判斷兩邊的值 是否不等 |
| !== | 不全等: 只有全等時為false, 其余都是true |
邏輯運算符
| 邏輯與 && | 兩邊為真即為真, 一邊為假即為假 |
| 邏輯或 | 一邊為真即為真, 兩邊為假即為假 |
| 邏輯非 ! | 真即是假, 假即是真 |
三元運算符
| ++ – ! …等 | 一元運算符 |
| + - * / % …等 | 二元運算符 |
| 條件表達式 ? true環境 : false環境 | 三元運算符:僅僅適合 做一些簡單判斷 |
5.流程控制
(一). 順序結構 : 代碼從上往下依次執行
(二). 分支結構 : 通過 if /switch 進行分支選擇
(三). 循環結構 : 將一些功能 不斷重復去執行
(1) 分支結構 if / switch
分支結構: 具有跳過某一段代碼的功能
if 分支結構
分支寫法1: if ( 條件表達式 ) true環境1 //不用加{} 條件僅僅只能影響緊跟在if后面的一條命令分支寫法2: if ( 條件表達式 ){true環境 } //條件僅僅能影響后面 {} 內的所有代碼.分支寫法3: if ( 條件表達式 ){true環境 }else{false環境 } // 條件為真時,則進入true環境,否則進入false環境分支寫法4: if ( 條件表達式1 ){true環境1 }elseif( 條件表達式2 ){true環境2 }elseif( 條件表達式3 ){true環境3 }... // 從多個表達式中,選擇一個滿足( 符合先來后到的原則 )分支寫法5: 巢狀分支. if ( 條件表達式1 ){if ( 條件表達式2 ){if ( 條件表達式3 ){...}} }switch分支結構
switch( 標志 ){case '標志1': 代碼塊; break;case '標志2': 代碼塊; break;case '標志3': 代碼塊; break;case '標志4': 代碼塊; break;....default 代碼塊; }//不寫break 則匹配到符合條件 后的所有case都會執行寫上break 則只會執行符合條件的一條代碼.如果沒有找到標志, 則會執行 default(2). 循環結構
1.while循環結構
? while( 條件表達式 ){
? 代碼塊
? }
- 如果條件為真 -> 則執行1次 代碼塊 -> 再回到條件表達式 -> 再次判斷條件 真 -> 再執行1次代碼塊 …
- 當條件為假 -> 立馬結束循環 -> 準備執行循環外的代碼
2.doWhile 循環
while 和dowhile的區別
- while 先條件判斷,在決定是否執行代碼塊
- dowhile 先執行一次代碼塊,在條件判斷,然后決定是否執行代碼塊
4.for循環
?for循環
格式: for( 初始值1; 循環條件2; 循環增量3){
? 代碼塊4
? }
執行順序
1 243 243 243
當條件2 為假時,則結束循環
初始位置和增量位置 可以不寫值
5.混合寫法:
以下所有寫法,都是在html代碼塊中寫的. 1.for 與 HTML 混合寫法<?php for( ): ?>html原生代碼<?php endfor ?> -------------------------------------- 2.if 與 HTML 混合寫法<?php if( ): ?>html原生代碼<?php endif(): ?> --------------------------------------<?php if( ): ?>html代碼 true<?php else( ): ?>html代碼 false<?php endif ?> ----------------------------------<?php if( ): ?>html原生代碼 true<?php elseif( ): ?>html原聲代碼 true<?php elseif( ): ?>html原生代碼 true...<?php endif ?>6.多重循環
多重循環: 在循環中 嵌套循環
7.流程控制符
break
立馬結束分支/循環,準備執行分支/循環外的代碼
continue
立馬結束當前一輪的循環,準備進行下一輪循環.
die /exit
立馬結束程序,die之前的代碼依舊執行
6. 函數function
作用 : 用函數封裝一些功能, 重復利用
函數分類:
- 系統函數: 數學,字符串,數組,其他函數等
- 自定義函數: 根據用戶需求來封裝函數
自定義函數: ( 聲明 )
-
格式:
function 函數名 ( 參數 ){
? 代碼塊
}
-
組成:
- 關鍵字: function
- 函數名 : 要有意義 ( 動詞+ 名詞)
- ( ): 聲明函數時的參數, 稱之為形式參數, 簡稱形參
- { }: 函數體代碼塊, 函數功能具體代碼
-
特性:
函數不調用不執行
函數一旦調用,name函數執行之后,會返回到調用函數的地方
-
小結:
功能相似, 位置相同 ,用 循環
功能相似, 位置不同, 用函數
-
調用函數:
函數名( )
函數名 ( 實參 )
(1).函數命名規范
命名規范
命名形式
-
駝峰命名法
從第二個單詞開始,首字母大寫
function addUserName( ){ }
-
帕斯卡命名法
每個單詞首字母都大小 ( 大駝峰 )
function AddUserName( ){ }
-
下劃線命名法
function add_user_name( ){ }
函數名不能重名
function var_dump(){ }
函數名不能重名包括系統函數和自定義的函數.
函數名要有意義
看到函數名 就大致能猜出是什么意思
多個單詞組成的函數名: 動詞 + 名詞
? getName( )
? sendMsg( )
? setInfo( )
(2) . 函數返回值
關鍵字: return
無return: 當函數的代碼塊全部執行, 會自動返回到調用函數的地方,沒有返回值(自然結束) 若強行接收返回值,則得到null
有return : 當函數的代碼塊執行到return時,則立馬返回到函數調用的地方,返回return值(提前結束)
返回值的類型
可以返回任意類型
如何返回多個值
將多個值存入一個數組中,最終返回數組幾個.
在外面通過數組一個一個取出
function demo3(){$a = 10;$b = 10.5;$c = [$a, $b];return $c; }(3). 參數
形參: 在聲明函數時給的參數 parameter
實參: 在調用函數時給的參數 argument
參數個數差異會有何種不同
實參個數 = 形參個數 完美
實參個數 > 形參個數
多余的實參被拋棄,
形參已按照先來后到的原則進行接收
實參個數 < 形參個數
多余的形參: 1.被當成未定義的變量 會報錯
? 2.采用默認值
實參個數不確定時???
計算器: 多個數字進行累加
形參 一個都不要寫
通過幾個函數來處理所有的實參
| func_get_args( ) | 以數組的形式接受所有的實參 |
| func_get_arg( n ) | 值接受下標為n 的實參 |
| func_num_args( ) | 獲取實參的總個數 |
(4). 變量作用域
變量作用域: 變量只能在指定的區域 起作用
全局變量: 在函數外部定義的變量
局部變量: 在函數內部定義的變量
注意:
? 默認情況下:
? ①. 全局變量 不能在局部環境中使用
? ②. 局部變量 不能在全局環境中使用
? 特殊情況下:
? ①. $GLOBALS[ 變量名 ]
? 可以在任意環境中使用, 該變量名 只能是全局環境中的變量
? ⑤. global 變量
? 該變量可以在函數外部直接使用
(5). 靜態變量
(六). 函數技巧
變量技巧可變變量: 將一個變量的值 作為另一個變量名 來使用引用變量 函數技巧可變函數: 將一個變量的值 作為函數名 來使用引用函數: 通過 &符 將內存地址賦予 // 引用函數例: function demo3(&$x){$x++;echo 'x = '.$x.'<br>'; }$b = 20; demo3($b); echo 'b = '.$b.'<br>';(6). 自定義函數
小技巧:
做任何功能, 考慮以下幾點
7. 數組 array
(1).定義格式:
array(鍵 => 值key => value,key => value,...key => value, )鍵: 只有int 或 string .
如果設置鍵為 float ,bool等其他類型,則會強制轉為int 或string.
鍵的別名: 下標 偏移量 索引, index offset
值: 任何類型
分類
索引數組: 鍵為 int
關聯數組 : 鍵為 string
格式:
$數組名[鍵] = 值
$數組名 = [ 鍵1=> 值1, 鍵2 => 值2 ,…]
$數組名 = array( 鍵1=> 值1, 鍵2 => 值2 ,…)
小結
多維數組
在數組中, 值設為數組,即為多維數組
(2).遍歷數組
基本遍歷方法: for while doWhile
指針遍歷方式: foreach
指針遍歷: 不需要考慮初始值, 不需要考慮增量, 不需要考慮條件
只能接受當前一輪的鍵 , 每一次循環, 都只能接收一個鍵或值
擅長遍歷 非索引,非規律數字的數組 foreach( 數組名 as 鍵 => 值 ){代碼塊 }若只需要值, 不需要用鍵, 可以簡化寫法 foreach( 數組名 as 值 ){代碼塊 }?
(3). 指針函數
| current( ) | 獲取當前指針所指向的值 |
| key( ) | 獲取當前指針所指向的鍵 |
| next( ) | 將指針 下移一位 |
| prev( ) | 將指針 上移一位 |
| reset( ) | 將指針重置到第一位 |
| end( ) | 將指針重置到最后第一位 |
| each( ) | 獲取當前指針的鍵和值, 且下移一位 |
一旦超出范圍, 是無法通過next 或 prev 返回數組中
next 和 prev 相對性的 移動指針
解決方案: 通過 reset 或 end 回到數組中
(4). 預定義數組
php系統預先定義好的"數組".
| $GLOBALS | 獲取全局環境中所有可用的變量 (超全局變量) |
| $_GET | 接收所有以get方式傳遞過來的值 |
| $_POST | 接收所有以post方式傳遞過來的值 |
| $_FILES | 用于接收上傳的文件 |
| $_COOKIE | 存儲瀏覽器端的cookie |
| $_SESSION | 存儲服務器端的session |
| $_REQUEST | 接收get, post 和cookie 的值 |
| $_SERVER | 存儲服務器相關的信息. 例如: 服務器名, 地址, 參數, 協議, IP … |
| $_SERVER的數組中 | |
| 下標 | 描述 |
| HTTP_HOST | 主機名 |
| HTTP_USER_AGENT | 終端, 瀏覽器信息 |
| REMOTE_ADDR | 客戶端IP |
| SERVER_ADDR | 服務器IP |
| SCRIPT_FILENAME | 腳本地址( 盤符 ) |
| SCRIPT_NAME | 腳本地址( 網址 ) |
| REQUEST_METHOD | 請求方式 |
| REQUEST_URI | 請求地址 (帶參數) |
| QUERY_STRING | 請求參數 |
字符串可以當索引數組來用.
0123456 $a = 'abcdefg';訪問 字符c echo $a[2]; echo $a[6];超出范圍, 返回 空字符串 衍生: 遍歷字符串時, 得到 空字符串, 則證明字符串已經遍歷完了 echo $a[999]; var_dump($a[999]);8. 正則
可見原子:
unicode編碼表中用鍵盤輸出后肉眼可見的字符
不可見原子:
unicode編碼表中用鍵盤輸出后肉眼不可見的字符
元字符
| 元字符:
| | | 匹配兩個或者多個分支選擇 |
| [] | 匹配方括號中任意一個原子 |
| [^] | 除了括號內的不可匹配,[]外匹配任意一個原子 |
| 2. 原子歸類 | |
| . | 匹配除了換行符之外的任意字符 |
| \d | 匹配任意一個十進制數字 [0-9] |
| \D | 匹配任意一個非十進制數字 [ ^0-9] |
| \s | 匹配一個不可見原子 [\n\t\r] |
| \S | 匹配一個可見原子 [ ^\n\t\r] |
| \w | 匹配任意一個數字字母或下劃線 [0-9a-zA-Z] |
| \W | 匹配任意一個非數字字母或下劃線 [ ^ 0-9a-zA-Z] |
| 3. 量詞 | {n} 表示其前面的一個原子恰好出現n次 |
| {n,} 表示其前面的一個原子最少出現n次 | |
| {n,m} 表示其前面的一個原子最少出現n次,最多出現M次. | |
| * 匹配0次,1次,或者多次其前面的原子 {0, } | |
| + 匹配1次或者多次其前面的原子 {1, } | |
| ? 匹配0次或者1次 其前面的原子 {0,1} | |
| 4. 邊界控制, 模式單元, 模式選擇符 | |
| ^ 匹配字符串開始位置 | |
| $ 匹配字符串結尾位置 | |
| () 匹配其中的整體為一個原子 | |
| ( | ) 匹配其中的兩個或更多的選擇之一, 分隔多選一模式 | |
| 5. 模式修正符 在定界符的后面 | |
| 貪婪匹配 U 匹配結果存在歧義時,取其長 例: .*/U | |
| 懶惰匹配 U 匹配結果存在歧義時,取其短 .*?/U | |
| 忽略空白 X 匹配結果忽略空白 | |
| 大小寫匹配 i 匹配結果不區分大小寫 |
單次匹配函數
preg_match( 正則, 對象, 結果) 結果是一個數組 返回每個匹配到的原子 返回值時1或者0
? 參數:
? 正則: 根據需求設計正則
? 對象: 將對象匹配正則
? 結果: 以數組形式接收 匹配的結果, 可省略
返回值: 成功的匹配的次數
成功: 1次
失敗: 0次
常用于: 判斷是否匹配成功
匹配全部函數
- preg_match_all( 正則, 對象 [,結果])
- 返回值: 匹配的次數
? 成功: >= 1
? 失敗: = 0
?
正則替換函數
- preg_replace( 正則, 替換值, 對象 )
- 常用于敏感字等…
正則函數 過濾 ---- 向后引用
preg_grep( 正則, 數組 )
1. 過濾不符合正則規定的格式 ? 2. **一般與向后引用一起使用**? 3. **向后引用**: \1 后面\1 與 前面第一個( )匹配的值 一模一樣? \num 后面\num 與 前面第num個( )匹配的值 一模一樣條件: 在使用\1 或 \2 或 \num 之前, 前面得要有 ( ) 小括號
注意: 在字符串中進行使用, 可以用 $1 或 $2 或 $num 來代替
( ) 單元模式
將( )內的內容當做一個整體, 作為一個大原子
( 這個大原子里面可能有好幾個原子 但是看做一個原子了哦~~~)
( ) 內的內容送進 子模式組
9. 時間
| date_default_timezone_set ( ‘PRC’ ); | 設置時區為中國 |
| date_default_timezone_get ( UTC ); | 獲取格林威治時間,所謂的世界標準時間 (默認UTC) |
| time ( ) | 獲取時間戳 從1970年-現在的秒數 |
| 格式化時間 data(格式 [, 時間戳] ) | 非字母 隨便寫, 都是原樣輸出------- 字母嚴格區分大小寫(大多數的字母都具有特殊意義) |
| Y year | 4位年份 2019 |
| y year | 2位年份 19 |
| m month | 月份 01-12 |
| d day | 天 01-31 |
| H hour | 24小時 00~23 |
| h hour | 12小時 01~12 |
| a am/pm | 上午/下午 |
| A Am/Pm | 上午/下午 |
| i minute | 分鐘 00~59 |
| s second | 秒 00-59 |
| microtime ****** | 微秒 獲取的是一個時間戳 |
| z | 今天是今年的第幾天 |
| W | 本周是今年的第幾周 |
| t | 本月一共多少天 |
| mktime( 時,分,秒,月,日,年 ) | 自定義時間 返回值:時間戳 |
| strtotime( ) | 字符串轉為時間戳 返回值: 時間戳 strtotime可以將字符串轉為時間戳 配合data格式化時間 將其轉為直觀的年月日時間 |
| now | 本地現在的時間 |
| yesterday | 前一天 |
| tomorrow | 明天 |
| last year | 前一年 |
| next year | 明年 |
| last minute | 上一分鐘 |
| last week | 上一周 |
| 5 day | 5天后 |
| -5 day | 5天前 |
| 10 second | 10秒之后 |
| 最多支持到2038年 |
10. 錯誤
(1) 錯誤的三種領域
語法錯誤 最常見,也最容易修復
若文件中,有任意一行代碼發生錯誤語法,name整個文件一行代碼都不會執行
運行時錯誤 在代碼的解析過程中,不合理,則報錯.運行時錯誤
比較常見 , 相對容易修復
? 有些運行時錯誤,會終止程序的運行
? 有些運行時錯誤,不會終止程序的運行
邏輯錯誤
最麻煩的錯誤, 不會提示錯誤 也不會終止程序.
(2).錯誤級別
- error 1 致命錯誤
- wrning 2 警告錯誤,不會終止程序
- …
- norice 8 提示錯誤,不會終止程序
(3). 屏蔽錯誤
在開發測試中建議全部打開查看錯誤,在正是上線中,建議全部屏蔽提高用戶體驗度
屏蔽方式1:
@ : 錯誤抑制符
? 那邊變量報錯,就在那里加@ 僅限于小代碼塊范圍使用
屏蔽方式2: 店長推薦 使用函數來屏蔽
| error_reporting(1); | 顯示錯誤報告 |
| error_reporting(E_ALL); | 顯示所有的錯誤報告 |
| error_reporting(E_ERROR); | 只顯示 error 錯誤報告 |
| error_reporting(E_WARNING); | 只顯示 warning 錯誤報告 |
| error_reporting(E_NOTICE); | 只顯示 notice 錯誤報告 |
| error_reporting(E_ALL ^E_WARNING); | 除了 warning 不報, 其余都報 |
| error_reporting(E_ALL & ~E_WARNING); | 除了 warning 不報, 其余都報 |
| error_reporting(E_ALL ^E_NOTICE); | 除了 warning 不報, 其余都報 |
| error_reporting(E_ALL & ~E_NOTICE); | 除了 notice 不報, 其余都報 |
屏蔽方式3:
通過 ini_set() 臨時改變"配置文件"
ini_set('error_reporting', E_NOTICE); ini_set('error_reporting', 8); echo ini_get('error_reporting');屏蔽方式4:
前面的3個屏蔽方式, 僅僅限于本文件的錯誤屏蔽, 不能屏蔽其他文件的錯誤
方式4: 通過直接 修改配置文件, 來屏蔽錯誤提示 (影響到整個服務器)
1 配置文件地址: wamp/bin/apache/apachex.x.x/bin/php.ini
2 修改配置1: error_reporting = 常量
3 修改配置2: display_errors = On 開啟錯誤提示 Off/關閉錯誤提示
4 注意: 在修改任意配置, 需要重啟服務器, 才能起作用
(4). 自定義報錯
? E_USER_ERROR
? E_USER_WARNING
? E_USER_NOTICE
error_log(s1, s2, s3)
- s1: 報錯信息
- s2: 消息類型 3: 將錯誤信息寫入目標文件
- s3: 目標文件
(5). 邏輯錯誤
縮小錯誤范圍:
? 1. 斷點法: 通過 die 來終止程序, 并輸出之前的相關變量, 來判斷是否有問題
? 2. 注釋法: 通過 注釋 來屏蔽局部程序
11. 文件
(1) 文件屬性: 常見分類
? 1.file文件
? 2.dir文件夾 目錄.
(2) 文件分類
| filetype( ’ 文件地址 ’ ) | 獲取文件類型 | 常見以file與dir居多,文件不存在時,返回false |
| filesize( ’ 文件地址 ’ ) | 獲取文件大小 | 文件的大小, 僅支持文件,不支持文件夾 |
| file_exists( ’ 文件地址 ’ ) | 判斷文件是否存在 | 返回值 bool型 |
| is_readable( ) | 判斷文件是否可讀 | 返回值 bool型 |
| is_writeable( ) | 判斷文件是否可寫 | 返回值 bool型 |
| filectime( ) | 獲取文件創建時間 | 可以設置date函數 設置返回的時間戳的格式 |
| filemtime( ) | 獲取文件修改時間 | 可以設置date函數 設置返回的時間戳的格式 |
| fileatime( ) | 獲取文件訪問時間 | 可以設置date函數 設置返回的時間戳的格式 |
(3). 文件路徑
? 1.文件分隔符
? window: 支持 / 也支持 \
? Linux: 僅支持 /
? 2.文件函數
?
| DIRECTORY_SEPARATOR | 獲取當前系統支持的分隔符( 常量 ) |
| dirname( ) | 獲取指定路徑的目錄 |
| basename( ) | 獲取指定路徑的文件名 |
(4)文件-目錄-操作
| openddir( ) | 打開目錄,返回資源 |
| readdir( ) | 讀取目錄資源,讀取完畢,返回false |
| closedir( ) | 關閉資源 |
| mkdir(目錄地址,0777所有權限, true開啟遞歸創建 ) | 創建空目錄 |
| rmdir( 目錄地址 ) | 刪除空目錄 |
| is_file( ) | 判斷是否為文件 |
| is_dir( ) | 判斷是否為目錄 |
| copy(復制誰,復制到那里去 ) | 復制文件 |
| touch( 文件地址 ) | 創建空文件 |
| unlink( 文件地址 ) | 刪除文件 |
| rename( 剪切誰, 剪切到哪里去 ) | 剪切 / 重命名 |
? . 當前目錄
? … 上一級目錄
? 一般情況下,很少用,只有直接操作命令時,才會用得上,或者操作上下級目錄時.
(5) . 文件加載
| include ’ 文件地址 ’ | 文件加載 ( 加載地址出錯 不會終止程序運行) |
| include ( ’ 文件地址 ’ ) | 為了避免 文件重復加載 通過include_once 來加載 |
| include_once ’ 文件地址 ’ | 沒有加載文件之前,無法使用文件中的變量 |
| include_once( ’ 文件地址 ’ ) | 支持相對路徑 盤符路徑, 不支持網址路徑 |
| require ‘文件地址’ | 文件加載 ( 加載地址出錯,立馬終止程序運行) 支持相對路徑 盤符路徑, 不支持網址路徑 |
| require ( ’ 文件地址 ’ ) | 同上~~~~ |
| require_once ’ 文件地址 ’ | |
| require_once( ’ 文件地址 ’ ) |
為了避免重復加載 使用 _ once 來加載
在沒有加載文件之前,無法使用文件中的變量
重復加載文件,就相當于將demo里面的代碼復制一份
多次加載加載的文件之間沒有關聯
include加載地址出錯,立馬終止程序運行
require加載地址出錯,不會終止程序運行
(6) 遞歸函數
1. 在函數內部調用自己 2. 在執行后,最終會返回到最初的地方 3. 滿足以上兩點為遞歸函數(7) 文件內容 文件操作
向文件賦予內容
file_put_contents(文件路徑,內容)
例: file_put_contents(’./demo.txt’, ‘how are you?’);
向文件獲取內容
file_get_contents(文件路徑)
file_get_contents(’./demo.txt’);
面試題 請用一行代碼獲取百度首頁
file_get_contents(‘https://www.baidu.com’)
打開文件
fopen('文件路徑','打開方式')r 讀 read文件指針指向開頭若文件不存在則報錯w 寫 write會刪除原由的所有內容若文件不存在,則自動創建a 寫 追加 append文件指針指向末尾若文件不存在則自動創建+ 增強模式需要配合以上三種模式形成r+ W+ a+ 將具備讀和寫的功能$handle = fopen('./demo.txt','r'); 返回值為資源讀取文件資源
fread(資源,字節) 讀取文件資源(指針形式) echo fread($handle,1); echo fread($handle,2); 會接著上一次讀到的地方讀下去 echo fread($handle,filesize('./demo.txt')); 讀完所有向文件資源寫入內容
指針指向最前 清除所有內容并寫入
fwrite(資源,內容) 想文件寫入內容 $content = '我今天要在這里寫點東西'; fwrite($handle, $content);追加內容,配合a方式
指針指向末尾,從最后寫入追加內容
fwrite(資源,內容) 追加模式 fwrite($handle, "I need a Mr.wang");增強模式
同時具備讀寫功能
fwrite($handle,'刺激刺激,裝完逼就跑');關閉文件資源
fclose(資源) 關閉資源 fclose($handle);(8) 接收上傳內的文件
接收上傳的文件(三道坎)
前端form, 設置MAX_FILE_SIZE 上傳大小
post協議(post_max_size), wamp限制: 8M以內
一旦超過,$_FLIES ,則接收不到上傳的文件
服務器限制(upload_max_filesize):2M以內
一旦超過, error = 1 錯誤號
如果需要更大的上傳限制,則修改配置文件php.ini
(9) 驗證
(10) 高頻率 uuid 設置唯一的id
UUID的好處: 能夠保證獨立性,程序可以在不同的數據庫間遷移,效果不受影響,保生成的ID不僅是表獨立的 而且是庫獨立的,這點在數據庫切分時 尤為重要.
function UUID(){$uuid = '';if (function_exists('uuid_create') === true){$uuid = uuid_create(1);}else{$data = openssl_random_pseudo_bytes(16);$data[6] = chr(ord($data[6]) & 0x0f | 0x40); $data[8] = chr(ord($data[8]) & 0x3f | 0x80); $uuid = vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));}return $uuid; }for ($i=0; $i < 10000000; $i++) { echo UUID().'<br>'; }(11) 文件下載
準備好前端html傳輸需要在的名字
//前端做好html a鏈接 鏈接php文件,傳參get 名字想要下載的文件名1. 接收需要下載的名字$name = $_GET['name'];2. 準備下載路徑$path = './download/'.$name;3.準備下載之后的名字(唯一性)$suffix = strrchr($name, '.');產生32位 隨機16進制字符,以保證唯一性$filename = str_shuffle(str_shuffle(MD5(mt_rand().uniqid()))).$suffix;header('content-Disposition:attachment; filename="'.$filename.'"');4. 讀取下載內容readfile($path);12 .面向對象
(1) 對象
對象概念
- 類: 抽象化 在定義功能
- 對象: 實例化, 在調用功能
類和對象的關系
- 類 就是對象的抽象化
- 對象 就是累的實例化
定義類
class 類名 {成員屬性(有什么)成員方法(會什么) }創建對象
對象變量 = new 類名
操作屬性 或 方法
-
條件限制: 必須要有對象才能操作
- 對象->屬性
- 對象->方法名( )
(2) 偽對象 $this
偽對象 $this
- 不需要聲明,直接代表當前對象
- 只能在 類內 使用
- 一般用于類內操作屬性 或 方法
偽對象使用方法 ---------- (以下內容與方法是在寫 類的內部的!!! )
-
方法1: var_dump($GLOBALS['name']);
-
方法2:
$b=new plane; var_dump($b);if($b == $GLOBALS['a']){echo 'Yes'; }else{echo 'No'; } -
方法3 :
- echo $this->變量名(不用寫$);
- $this->類內部的方法名();
(3) 連貫操作 OOP
對象-> 方法1()->方法2()->方法3()
注意點; 在使用連貫操作的時候, 需要前面一個方法 返回一個對象. 用以調用后面的方法
所以要在方法1,方法2,…中return $this 只有這樣才能夠讓后面的方法能夠調用
個人總結: 1. 調用方法 強行接收 會收到**null**,
? 2.在方法內**ruturn $this;可以返回當前對象(整個類)**
例:
class Person{public $name = '老王';public $age = 18;public function step1(){echo '黑虎掏心 <br>';var_dump($this);return $this;}public function step2(){echo '白虎掏陰 <br>';}}$a = new Person;$a->step1()->step2()->step3();//return $this 之后后面的方法才能在對象中調用方法(4)魔術方法
魔術方法定義: 在觸發特定的條件時, 自動調用魔術方法
構造方法 public function __construc(){...}
- 觸發條件: 實例化時,自動調用 (也就是new一個對象的時候自動調用)
- 常用于: 初始化
- 不需要返回值
- 實例化時: 變量 會接收 對象
- 調用時: 變量 接收 返回值
- 位置: 寫在屬性的最后面, 方法的最前面
- 在沒有 構造方法時, 實例化的瞬間, 自動執行同類名的方法
- 就是 方法名與 類名相同的情況下,在new實例化的瞬間會被執行.
- 必須寫在 屬性的后面, 方法的最前面
析構方法 public function __destruct( ) { ... }
- 觸發條件: 在對象被銷毀時,自動調用
- 屬于被銷毀的幾種情況
- 程序自然結束時
- 對象被覆蓋時
- 對象被刪除時
- 不能有參數
- 位置: 寫在方法的最后面
- 例: 磊哥上課例子. 面試題…挺難的
(5) PDO 操作數據庫 ( 數據庫抽象層 )
鏈接數據庫
new PDO ( DNS, USER , PWD)
- 參數
- DSN :數據庫:host=主機IP地址;dbname=庫名;charset=編碼
- USER: 用戶名
- PWD: 密碼
準備sql語句
例: $sql = ' select * from user';
執行sql語句
-
PDO->query( sql語句 ) =====> 返回值: PDOStatement對象
例: $res = $pdo->query(xql語句)
-
通過 PDOStatement 獲取數據
- PDOStatement -> fetch ( 參數 ) 獲取一條數據
- PDOStatement -> fetchAll ( 參數 ) 獲取所有數據
- ? 參數 : PDO::FETCH_ASSOC 關聯
- ? PDO::FETCH_NUM 索引
- ? PDO::FETCH_BOTH 混合 (默認)
總結
- 上一篇: 布隆过滤器(Bloom Filter)的
- 下一篇: NOIp2018滚粗记