PHP 基礎教程(漫談)
之前學習php的時候隨手記下來的筆記(應該是PHP5.x版本相對老,有些可能在php7中已經修改或者棄用 ),比較散,現在複習一下,於是就順手整理一下並修改了一些錯誤和補充了一些內容。
1.關於 PHP 檔案的解析
(1) php的檔案字尾是由apache配置檔案(.htaccess) 決定的,他決定讓PHP應用伺服器用解析什麼字尾作為php
(2) phpinfo(); 看到php 執行環境的所有引數
(3) php 檔案中可以巢狀很多種指令碼語言,html css javascript 等,<?php?>
之外的都是直接傳送給客戶端,裡面的php程式碼應用伺服器解析後再發送給客戶端
2.語言標記
<?php ?>
——————>推薦使用
<??>
——————->PHP 的短標籤(需要php.ini中開啟 short_open_tag = On)
<?=$var?>
——————>PHP 的短標籤相當於 <?php echo $var ?>(需要php.ini中開啟 short_open_tag = On)
<%%>
——————>ASP風格(此種風格需要在配置檔案php.ini中啟用asp_tag選項)
<script language="php"> </script>
———->javascript 風格,在一些繞過中比較有用
3.指令分隔符
語句分為兩種,一種是 功能執行語句 後面一定要加分號,一種是結構定義語句 後面一定不能加分號。
注意:與?>最近的一條語句可以不加分號
4.註釋
//———————>單行
/* */
——————>多行
# ———————->指令碼註釋
/** */
—————->文件註釋
特別強調:
當?>之後就是檔案結尾的時候,可以不要這個東西,並且建議不加這個東西,因為在檔案包含的時候,一些頭函式 session cookie 什麼的前面一定不能有空白,但是你在?>之後可能會不經意後回車什麼的產生,這樣包含的程式就會出錯,不加一直到檔案尾的全部都認為是php程式碼,不會有事。
5.變數
1.php可以用關鍵字命名
2.開頭不可以是數字或者運算子號(變數名的第一個字元已經擴充套件為 [a-zA-Z_\x7f-\xff] )
3.需要輸出多次,或者可能會修改那就用變數
4.$變數名=值
沒有型別,因為php是弱型別的語言,變數型別由儲存的內容決定
5.PHP可以連續賦值
6.php變數和常量區分大小寫,但是其他不區分
7.PHP變數名要有意義,
8.命名習慣是第一個單詞首字母小寫,其餘首字母大寫$aaaBbbCcc(駝峰式命名法)
6.可變變數
可變變數比較容易出現變數覆蓋的問題
$one="aaa"; $a="one"; $$a=? --->aaa
7.引用賦值
類似於C指標
$a=&$b;
8.型別
整型 浮點型 布林型 字元型
複合型別 –》陣列 類
資源型別 –》 如fopen()
var_dump()可以檢視型別
9.變數宣告
$int=10 十進位制 $int=045 八進位制375 $int=0xff 十六進位制 25 $int=3e5300000
整數的最大值是4位元組 2的32次方
以下都是假
$bool=false; $bool=0; $bool=0.00; $bool=""; $bool=" "; $bool="0" $bool=array(); $bool=null
10.字串的宣告
1.單雙引號能宣告字串
2.字串沒有長度限制
3.在雙引號 宣告的字串中既可以直接解析變數 ,又可以使用轉義字元
4.在單引號 宣告的字串中不可以 直接解析變數,也不可以使用轉義字元(轉義字元\只能用來轉義他自己,和單引號)
5. 字串中巢狀變數
echo "asdada$int sdadadadadasdadas$int dasdsadsadadadadasda";
這裡面解析變數是要有空格的,輸出的時候也有,因為合在一起區分不了變數。解決方法是在變數外面加大括號
echo "asdada{$int}sdadadadadasdadas{$int}dasdsadsadadadadasda";
或者
echo "asdada${int}sdadadadadasdadas${int}dasdsadsadadadadasda";
6.雙引號中不能使用雙引號,單引號中不能使用單引號
注意:
最好使用單引號,越簡單的東西浪費的資源越少,開發中有大量的輸出,除非需要的時候用雙引號
7.定界符宣告字串
$str=<<<p adkladaaksdak''a''"""sad'""a'‘’asdad{$int}dad\nadad\t\\adadaad\r p;
這裡的p是自定義的,第一個後面不能有任何符號包括空格,第二個前面不能有任何符號,包括空格。
定界符裡面能解析變數,轉義字元,單引號雙引號
11.PHP的特性
會把多個0當成一個0
12.瀏覽器特性
會把多個空格解析為一個空格比如在字串裡面有一個\t,頁面只會顯示一個空格,但是原始碼裡面很多個\n頁面也是隻有一個空格,原始碼裡出現回車。
13.變數型別轉換
一種是強制轉換
setType(變數名,型別)
型別有 int iteger float double real bool boolean string array object
settype() 這個函式是將原變數的型別轉換,
$val=intval(變數或值) $val=floatval(變數或值) $val=stringval(變數或值) $a=(int)"100.131231asdad"
注意:
1.轉換的時候一定要注意數字的範圍
整數佔4個位元組,浮點數佔8個位元組,那麼超過四個位元組轉換成整數就會出現溢位 整數最大是 2.147483648e9
超過或者等於這個值就會出錯。
2.字串轉換的時候注意,開頭是數字的字串,轉化成整型就會擷取前面的數字,但是後面的不會有,純粹>的字元換或者空字元都會轉化成0
另一種是自動轉換
這種用的比較多,因為這種情況下我們開發的時候不用管理型別,他會根據環境自動轉換。
示例程式碼:
$a="100.123123adaddda"; $b=2.147483648e9; $c=10; $d=true; echo $sum=$a+$b+$d+$c; 2147483759.1231
14.和變數有關的一些函式
gettype(變數名) 得到型別
isset() null 代表不存在 但是” “代表存在 ‘’代表存在
empty() “ “代表不為空
15.變數型別測試函式
is_bool() is_int() is_integer() is_long() is_float()is_double()is_real() is_array() is_resource() is_object() is_scalar() ------------->是否是標量,整型,字串,浮點型,布林 is_numberic() is_callable() ----------->檢查類中的方法是否可被呼叫(當然先檢查是否存在) method_exists() ---------->只會檢查是否存在,能不能呼叫不關他的事 print_r()列印陣列 echo 列印普通變數
16.常量
常量用 define(“常量名”,值)定義,
常量使用範圍比變數更廣,在全域性定義的變數在子函式中找不到,不能用除非 使用時在前面加 global $a 但是常量只要在全域性定義記就沒有限制。
常量定義以後就不能修改,也不能用unset取消,
常量在任何時候都不加$
常量的值只能是標量,(四種)
defined判斷常量是否存在
預定義常量和魔術常量
預定義M_PI 魔術 __FILE__
17.運算子
1.算術運算子
% 有兩個目的
1.用來整除
2.用來控制數字大小
注意:
使用時,他會把他兩邊的數全部轉化成整數再進行運算,因此不要用小數取餘也儘量不要用負數
2.字串運算子.
不僅可以把兩個字串連線成新的字串,還可以把一個任意標量和一個字串連線成新的字串。
3.賦值運算子
= += -= 、= *= %=.=
賦值運算子左邊必須是變數,右邊是表示式
4.比較運算子
== <> !==== !==
注意:
這裡面不要用一個等於號,那個是賦值語句 特別注意這個!== 這個叫恆不等於,他當數值相同但是型別不相同的時候 會返回真,但是!= 在這種情況下就會返回假。換句話說只要有一個不相等就會返回真。
5.邏輯運算子
&& and|| or ! not
處理的都是bool 返回的也是bool
同一級不要出現不同的運算子混合,最好要加括號
6.位運算
& | ^ ~ << >> >>> 位運算會把左右的字串轉化成ascll會把浮點數轉化成整數 進=進行二進位制的運算 >>2相當於除以4 <<2相當於乘以4 >>>無符號右主要是跨平臺用
注意:
& | 既可以做位運算子也可以做邏輯運算子,但是這裡面有著很大的區別。
7.短路問題:
使用&& || 會存在短路問題,會有一遍可能不執行,但是 & | 兩邊都要執行完畢不會出現短路問題
``可以執行系統命令echo `ipconfig`;
@ 可以消除錯誤提示 @gettype()
提醒:用括號改變優先順序比較好
18.函式
1.定義:
函式是被獨立命名的,獨立的程式碼段,他執行特定的任務,並可以給呼叫它的程式返回一個值傳進函式的變數在函式中改變並不會影響該變數的值,這和c語言是一樣的,除非你傳進去的就是地址。
2.函式的優點
(1)提高程式的重用性
(2)提高程式的可維護性
(3)提高軟體的開發效率
(4)提高軟體的可靠性
(5)控制程式的複雜性
3.函式的宣告
function 函式名(引數1,2,3) { 函式體; 返回值; }
注意:
一.函式必須呼叫才能執行,函式呼叫可以在宣告前也可以在聲明後 二.函式名和變數名一樣,aa bb cc aaBbb
三.php沒有名稱空間的概念,因此函式在宣告時絕對不能重名。(不僅和自己,還要和系統函式)
四.可以通過像函式傳遞引數來改變函式的行為,括號裡面的變數和內部定義的變數是一樣的,都是區域性的。唯一不同的是,他可以在呼叫時賦值,裡面的變數不可以
五.沒有返回值就成為過程 六.我們把所有的返回值全部存到一個變數裡面,然後返回這個變數,誰呼叫的他,就要返回到誰那裡去。
七.函式執行到return就停止了,因此後面不要寫語句。
4.可變函式
變數() php會尋找和變數值同名的函式
5.編寫函式的規範
在編寫函式的時候應該說明以下幾點:
1.函式的功能
2.函式的引數
3.函式的返回值
php有2000多個系統函式,同樣的功能你能寫出來但是一定要使用系統函式,執行效率更高
函式的引數都是以型別 + 值 的方式寫入的(宣告時)
6.函式的分類
1.常規函式
bool copy(string source ,string dest)
2.帶有mixed
mixed表示可以傳入任意型別的引數
bool chown(string filename,mixed user)
3.帶有&的引數
表示引用賦值,必須傳入一個變數,傳進去的變數在函式中操作的是地址,直接就會被改變。
bool arrest(array &array [,int sort_flag])
4.帶有中括號的引數
這種引數是可選的,如果你傳入了值,就按照你傳入的值用沒傳值,就用預設值。
bool arrest(array &array [,int sort_flag])
怎麼做到這樣子呢??
只要在定義的時候傳進去預設值就行了。
function($a,$b,$c=10){}
這個時候如果第三個引數不傳值,那麼會用預設的10
注意:在設定的時候可選值絕對不能放在必須值得前面
5.帶有…的引數的函式
…表示可以穿任意多個引數
int arry_unshift (array & array ,mixed var [,mixed...])
6.回撥函式
帶有callback引數的函式,就是呼叫這個函式我們需要傳遞一個函式進來(函式名),
array array_filter(array input [,callback callback])
7.內部函式
可以再函式內部再次宣告函式,目的就是在函式的內部呼叫,用來幫助外部函式完成一些子功能。
8.遞迴函式
在自己內部呼叫自己
9.系統函式
19.PHP 變數的範圍
區域性變數:在函式內部宣告的變數就是區域性變數,只能在函式內部使用。
全域性變數:在函式外宣告,聲明後整個指令碼結束前都可以使用的包括在函式中和{}中都可以使用。
注意:
(1)php的變數分不出是宣告還是呼叫,不像js 宣告是var 變數,呼叫直接就是變數
(2)在php中使用全域性變數要通過global 關鍵字將這個全域性變數包含到這個函式中,目的是告訴函式你使用的這個變數是全域性而不是函式內部的(global宣告之後用的才是全域性的)
20.php中的靜態變數
靜態變數只能在函式中或者是類中宣告,不能在全域性宣告。
使用static 在變數前
作用:一個變數可以在同一個函式多次呼叫中重用
1.靜態變數在靜態程式碼段中儲存
2.一個函式在多次呼叫之間重用,但是隻在第一次呼叫函式時宣告到記憶體,以後再呼叫就不再宣告,直接使用
3.靜態變數只能初始化為一個字元值或者一個常量,不能是表示式,即使變數定義時沒有賦初值,系統也會自動賦值為零,或者是空字元。
21.包含檔案
1.常見的四種方法:
require 可以重複包含
inculde
require_once 自動檢測是否重複包含,並且只能包含一次
incukde_once
注意:這些都是系統指令,都有兩種用法,
比如:
include(“檔名”);
include “檔名”;
echo(”@@@@@@@@@@@@@@@@@”);
echo “@@@@@@@@@@@@@@@@@@”;
這種包含不是直接拷貝(因為很多都不是php的語法),而是當成php解析後輸出的程式碼
我們知道在PHP中是沒有名稱空間的,所以一個函式名不能定義兩次,也就是如果檔案中有定義函式的內容那麼這個檔案就不能被包含兩次,這就是include_once和require_once存在的意義
但是,功能多的函式效率一定比較低。建議使用不帶once的
2.require 和 inculde的區別是
require 是靜態包含,就是確定要包含什麼
include 是動態包含被包含內容可能有變數。
22.陣列
一.陣列的概述
1.陣列的本質:管理和操作一組變數,成批處理
2.陣列是複合型別
3.陣列中可以儲存任意長度的資料,儲存任意型別資料
4.php 中的陣列就可完成其他語言資料結構的功能(連結串列,佇列,棧,集合等)
二、陣列的分類
陣列中有多個單元(單元稱為元素)
每個元素(下標[鍵],值)
單獨訪問元素的時候,都是通過下標來訪問的
1.一維,二二維,三維,多維陣列(陣列的陣列)
2.PHP中有兩種陣列
①索引陣列:下標是順序整數作為索引的
②關聯陣列:下標是字串作為索引的
下標(整數,字串)只有這兩種
三、陣列的宣告方式
1.直接為陣列元素賦值
a.這種情況下可以不給索引,那麼他會按照順序一個一個的賦值 b.如果突然在中間給了一個值的索引,後面的就會從所給的索引值加一開始 c.如果後面給了兩個索引值,那麼會從最大的值加一開始 d.關聯陣列的就是把數字改成字串就行了 e.混合宣告兩者互不影響。
2.使用array函式賦值
a.預設是索引陣列 b.用“鍵”=>值使之成為關聯陣列 c.二或多維陣列多個數組成員之間用逗號隔開 d.把二維陣列香香成一個表格,那麼三維陣列就是三個表格
3.使用其他元素賦值、
如file()會把檔案內容的每一行存到一個數組裡面。
四、陣列的遍歷
1.for語句迴圈遍歷
a.其他語言只有這一種方式(首選) b.php裡面這種方式並不是首選的 c.用這種方式遍歷陣列必須是索引陣列,並且下標必須連續
2.foreach 語句迴圈遍歷
foreach(陣列變數 as 變數值) { 迴圈體; } a.迴圈的次數由陣列的元素個數決定,有幾個迴圈幾次 b.每一次的迴圈都會將陣列中的元素分別賦值給後面的變數 c.如果是關聯陣列,還想知道鍵值那麼可以使用它的第二種形式 foreach(陣列變數 as 變數1=>變數2) { echo 變數1 ."===>".變數2 ; } 變數1存鍵值變數2存值
3.while() 和each() 或 list()結合使用
each()函式
a. 需要一個數組作為引數 b. 返回值也是一個數組 c. 返回的陣列是0,1 key value 四個固定的下標 0和key 是當前陣列元素的鍵 1和value 是當前陣列元素的值 d.預設當前元素就是第一個元素 e.每執行一次就會將當前元素向後移動 f.如果到最後的元素再執行這個函式,就會返回false g.相當於返回兩個,一個是索引陣列,一個是關聯陣列
list()函式
a. list($a,$b,$c...)=array(1,2,3,...); b. 陣列中的元素個數要和list中的元素個數相同,如果只想列印一個,其他兩個變數的位置也要空出來 c. 陣列中的給每個元素會賦值給list()中的每個引數,list()會把每個值轉化成變數 d. list() 只能接受索引陣列,並且按照索引的下標從小到大的順序。 while(list($key,$value)=each($usr)) { echo $key."====>".$value."<br>"; } 但是這個還是有弊端,因為each()執行一次指標就會跑到最後下一次再使用就不行了,下面介紹已解決辦法
使用陣列的內部指標控制函式
next(陣列)
prev(陣列)
reset(陣列)
end(陣列)
current(陣列)取當前元素
key(陣列)取當前鍵值
五、超全域性陣列
預定義陣列
自動全域性變數 —- 超全域性陣列
1.包含了來自web伺服器,客戶端,執行環境以及使用者輸入的資料
2.他們在全域性範圍內自動生效,都可以直接使用這些陣列
3.使用者不能自定義這些陣列,=但是操作方式和原來一樣。
$_GET $_POST $_REQUEST//經由get post cookie 提交的資料都可以由他來接受,因此該陣列不值得信任,最好不要使用. $_FILES//經由 http post方法提交至指令碼的檔案 $_COOKIES $_SERVER $_ENV//伺服器,作業系統的環境資訊 $_SESSION//變數由web伺服器設定,或者直接和當前的執行環境有關 $GLOBALS//只要是當前指令碼有效的變數都在裡面,數陣列鍵名為全域性變數的名稱
注意:
不要用變數來接受請求的引數,這種輸進去的引數可以直接被轉化成變數,那樣帶會來安全隱患,並且一般管理員並不開啟自動註冊為全域性變數的選項
為什麼不能一直使用get請求?
因為get請求是在位址列裡面的,而位址列是有限長度的,最長是8092位元組,並且明文顯示是很不安全的。
六、陣列的相關處理函式
1.和陣列鍵值相關的函式
1.array_values()返回陣列中所有的值並返回數字索引 2.array_keys() 返回陣列中的鍵值,有兩個可選引數,可以指定返回那個值得鍵值,第三個引數可以指定第二個引數是否需要嚴格按照型別進行匹配,嚴格true不嚴格就是false。 3.in_array()判斷第一個引數是不是在陣列中(第二個引數)還有第三個引數用來判斷型別。 4.array_key_exists() 判斷鍵值是否存在與陣列當中。 5.array_flip(陣列)交換陣列中的鍵和值(但是注意如果不同的鍵值對應同一個值得話,反過來同一個鍵值對應著不同的值,那麼後面的就會把前面的覆蓋) 6.array_reverse()把陣列對調,
2.統計陣列元素個數和唯一性
1.count()sizeof() 2.array_count_values() 統計陣列中值出現的次數,返回一個數組。 3.array_unique()移除陣列中重複的值,返回一個沒有重複值得陣列
3.使用回撥函式處理陣列
1.array_filter(陣列,自定義函式)用回撥函式過濾陣列中的單元,函式返回真資料留下否則不留)
2.array_walk(陣列,函式,其他)對陣列中的每個元素應用回撥函式,鍵和值都會傳到函式中,值作為第一個引數,鍵作為第二個引數,因此這個函式需要接受兩個值,還存在第三個引數,可以也當做變數傳入中間的函式,作為引數
3.array_map(函式,陣列,[陣列])將回調函式作用到對應的陣列元素值上,返回值是一個數組。第三個陣列的元素個數一定要和第二個陣列相同,函式可以接受兩個引數,分別是兩個陣列對應的元素,進行操作,一定要用return 返回,
注意一下:
一.array_map() 和array_walk()還是有一定區別:
1.array_walk()能把陣列的鍵和值全部傳進去,但是array_map()只能傳進去。
2.array_walk()可以直接對陣列進行操作不需要回值,但是array_map()就是根據傳入的值得情況去返回一個值,代替原值,形成一個新的陣列
二.array_filter()和array_map()也有區別:
前者返回的只是true或者false,True的保留,false的移除形成一個新的陣列,但是不能改變陣列元素的值
七、陣列的排序函式
陣列排序函式
sort()
rsort()
usort()
asort()
arsort()
uasort()
ksort()
krsort()uksort()
nasort()
natcasesort()
array_multisort()
1.簡單的陣列排序、
sort() rsort() sort(array &array[, int sort_flag])
都是直接改變原陣列的
2.根據鍵值對陣列進行排序
ksort() krsort()
3.根據值進行排序
asort()arsort()
注意:
sort()和rsort()也是根據值進行排序的但是他會忽略鍵值,排序完就成了順序排列的數字,但是這個不會,鍵值對的關係將會保留。
4.根據自然數排序法對陣列排序
natsort()natcasesort()
前一個區分大小寫,後一個不區分
$arr=array("file1.txt","file2.txt","file11.txt","file6.txt");
類似於這樣的陣列,如果我們直接根據值進行排序,一位一位的比較但是我們得到的會是 1 11 2 6 這樣的結果,我們用這兩個也會是一位一位的比較,但是數字的排序是正確的
5.根據使用者自定義的規則對陣列進行排序
usort()uasort() uksort()
引數採用陣列,回撥函式的模式
function sortbylen($one,$two) { if(strlen($one)==strlen($two)) return 0; else { return (strlen($one)>strlen($two))?1:-1;//正一代表往後移,負一代表往前移。 } }
6.多維陣列進行排序
array_multisort()
八、拆分 合併 分解 結合 的陣列函式
1.array_slice(陣列,起始,結束)
注意:
陣列下標從零開始
他並不是在源陣列上進行操作,而是返回一個新的陣列,
還有第四個引數 true或者false true 的話鍵值不會改變,保留原來(這對關聯陣列沒有影響,始終是保留鍵值的)
2.array_splice()
直接改變原陣列,選擇陣列中的將其刪除,並將刪除的陣列返回,如果有第四個引數(一個數組)就把他們用這些值一一替換
3.array_combine(鍵名陣列,鍵值陣列)
合併兩個陣列建立一個新的陣列,其中一個數組作為鍵名 一個作為鍵值如果一個數組為空,或者兩個個數不相同就會返回假
4.array_merge()
把一個或者多個數組合併成一個數組,如果鍵名有重複,該鍵的鍵值為最後一個對應的值,後面的覆蓋前面的。如果陣列是數字索引那麼陣列會以連續的重複索引合併在一起
5.array_intersect()
計算陣列的交集
6.array_diff(陣列1,陣列2)
返回兩個陣列的差集,返回的是陣列1有但是陣列2沒有的部分。
九、陣列與資料結構相關的函式
1.使用陣列來實現堆疊的功能
array_push(陣列,值1,值2…)入棧———–》我們一般使用 $a[]=”” 直接賦值的方法來入棧,這樣效率更高,但是連續入棧兩個我個人覺得函式更加方便
array_pop(陣列)出棧 ————》每次出棧一個,並返回
2.使用陣列實現隊的功能
array_unshift(陣列,值1,值2….)
注意:
php的隊尾是陣列的最左邊,值1比值2後進隊。
array_shift(陣列)
刪除隊頭元素,記得用一個值接受
特別注意 :
unset()======>既可以刪除變數,也可以刪除陣列中的元素,還可以刪除物件中的成員
3,其他和資料操作有關的函式
array_rand(陣列,個數)
隨機從陣列中取出一個或者多個元素的鍵值並且返回取一個就返回一個,取得多就返回陣列
shuffle()
將陣列中的元素隨機打亂,成功時返回真,失敗時返回假(對原陣列直接操作)
array_sum()
將陣列元素求和
range(元素的最小值,最大值,步長)
建立一個包含指定範圍內元素的陣列,有三個引數,前兩個可以是字母
array_map(函式名,陣列)
將陣列的每一個值傳入一個函式,返回的是函式處理之後的新陣列。
結語
這些就是PHP 的最基本的語法內容,其他面向物件的 內容請關注我的另一篇文章《PHP 程式設計進階(重點是面向物件和MVC)》