php基礎
基本語法形式
區(qū)分大小寫
- 主要是指變量名區(qū)分大小寫
- 常量通常也區(qū)分,但常量也可以自己設定為不區(qū)分(不推薦)
- 函數(shù)名不區(qū)分
- 系統(tǒng)中使用的關鍵字也不區(qū)分大小寫,比如if, else, for
語句結束符,用分號
- 一個php標記塊中的最后一個分號可省略
- php結束標記省略則不能省略最后一個分號
不建議省略!
變量
基本含義
變量是包含了一個名稱和一個值的“標識符”。
形式:變量必須以$開頭,后面緊跟變量名
//表示變量名$val 引用了數(shù)值1的地址
//當我們在代碼中使用$v1這個變量名,就是指使用“1”這個數(shù)據(jù)值。
$va1 = 1;
注意:通常,在“能夠出現(xiàn)”變量的語法中,只要出現(xiàn)$符號,并在其后出現(xiàn)緊挨著的字符,就會被識別為一個變量,即使不存在該變量,
echo “人民幣符合¥像個羊,美元符號$象個錢”;//這里就會有問題!
變量的基本使用
-
定義變量(賦值):直接給變量賦值,就是定義;
- 不支持js中的那種“定義但不賦值”的語法。
- 第一次給一個變量賦值,就算定義變量。
-
取值:所有需要一個變量值的語句中,就會取得該變量的值,常見包括
- 輸出:echo
$v1; //取得$v1的值,并輸出
- 給其他變量賦值
$v2 = $v1; //取得$v1的值,并賦值給$v2
- 參與運算:
$v3 = $v1 + 3; //取得$v1的值,并跟3相加
- 輸出:echo
-
判斷變量是否存在isset()
- 存在,就返回true,不存在就返回false
- 實際上,如果一個變量的值是null,返回的也是false
-
修改變量值(賦值)
- 第二次及以后給一個變量賦值,就算修改變量值
刪除unset():就是斷開變量名跟數(shù)據(jù)之間的“引用關系”
命名規(guī)則
通常命名包括變量名,函數(shù)名,常量名,類名,接口名,等等
基本規(guī)則
- 只能使用大小寫字母,下劃線(_),數(shù)字
- 數(shù)字不能開頭
- 不能跟所在環(huán)境(系統(tǒng))的關鍵字重名(比如if, for, function...)
行業(yè)規(guī)則(潛規(guī)則)
基本規(guī)則,保證的是語法的正確性。
行業(yè)規(guī)則,保證的是是否能得到別人的尊重!
行業(yè)規(guī)則中,有如下幾種常用的命名規(guī)則:
- 駝峰命名法:
示例:name, myName, myFatherName - 帕斯卡命名法:
示例:Name, MyName, MyFatherName - 下劃線間隔法:
示例:name, my_ame, my_father_name
變量間的傳值方式
- 這里討論的傳值方式是指:一個變量對另一個變量
- 它不僅僅適用于賦值語句,也適用于其他有同樣含義的語句,比如:函數(shù)的實參到形參
- 傳值方式只有2種:值傳遞,引用傳遞
- php中,所有變量,默認都是值傳遞。
- 要想使用引用傳遞,必須使用引用傳遞的符號: &
值傳遞
是指將一個變量的數(shù)據(jù)值(數(shù)據(jù)內容)拷貝一份,然后賦值給另一個變量。
$v1 = 1;
$v2 = $v1;//有值傳遞
$v3 = $v1 + 10;//無值傳遞
引用傳值
將一個變量的引用關系拷貝一份,然后賦值給另一個變量,即另一個變量也同樣由該關系決定了指向某個數(shù)據(jù)
$v10 = 10;
$v20 = &$v10;
賦值(傳值)完之后,兩個變量指向同樣一個數(shù)據(jù)。則:對變量v10的操作,改變的數(shù)據(jù),也就是體現(xiàn)為v20也發(fā)生了改變。
$v10++;
echo $v20;//11
在這種引用傳值的情況下,unset一個變量,則另一個跟它有關(指向同樣數(shù)據(jù)的關系)的變量,并不受影響。
unset($v20);
echo $v10;//11
echo $v20;//報錯,提示Undefined
可變變量
所謂可變變量,就是一個變量的名,又是一個變量。
$v1 = “abc”; //這是一個字符串變量,其內容是字符串“abc”
$abc = 10; //這是一個普通變量,其內容是數(shù)字10
echo $$v1; //此時,就是所謂“可變變量”
- 凡是$符號出現(xiàn),就會有可能理解為是一個變量
-
這里第一個“$”出現(xiàn)了,則php就視圖將其解釋為一個變量,變量名是$v1
; - 我們有知道,$v1的值是”abc”,
- 那么,第一個“$”符號后面的變量名,就得到為“abc”
- 即:echo 試圖輸出的是變量$abc, 自然是數(shù)字10
即從最右邊的$符號開始看起$(&v1) => $abc => 10,理論上,可變變量的嵌套還可以更多,比如:$$$def;
預定義變量
預定義變量又叫超全局變量,包括:$_GET, $_POST, $_SERVER, $_REQUEST, $GLOBALS, $_COOKIE, $_SESSION, ..........(大約10個)
- 作用域問題:php中,自定義的變量的作用域,分兩種:全局作用域(函數(shù)外),局部作用域(函數(shù)內)。但預定義變量的作用域稱為“超全局作用域”:全局作用域 + 局部作用域的總和(函數(shù)內外全都可用)
- 數(shù)據(jù)類型問題:超全局變量都是數(shù)組!
$_GET變量(數(shù)組)
$_GET這個預定義數(shù)組變量,就是指以GET這種方式提交的所有數(shù)據(jù)的集合(數(shù)組),例如
形式一:
<form action=”abc.php” method=”get” >
項目1: <input type=”text” name=”uName” />
項目2: <input type=”password” name=”uPswd” />
<input type=”submit” value=”提交” />
</form>
其作用是:用戶填寫表單數(shù)據(jù),并提交后,會將數(shù)據(jù)發(fā)送(提交)給頁面abc.php,其實也可以理解為“打開”該網頁(abc.php),還可以理解為“請求”該網頁(abc.php)
形式二:
<a href=”abc.php?uName=test1&uPswd=123”>Get</a>
其作用是:用戶點擊鏈接后,會將數(shù)據(jù)發(fā)送(提交)給頁面abc.php,其實也可以理解為“打開”該網頁(abc.php),還可以理解為“請求”該網頁(abc.php),這種請求也是get請求
形式三:
<script>
location.href = “abc.php?uName=test1&uPswd=123”; //利用location對象的屬性href
</script>
其作用是:當該行語句執(zhí)行的時候(通常其實是在函數(shù)中),會將數(shù)據(jù)發(fā)送(提交)給頁面abc.php,其實也可以理解為“打開”該網頁(abc.php),還可以理解為“請求”該網頁(abc.php),這種請求也是get請求
形式四:
<script>
location.assign( “abc.php?uName=test1&uPswd=123”); //利用location對象的方法assign()
</script>
其作用是:當該行語句執(zhí)行的時候(通常其實是在函數(shù)中),會將數(shù)據(jù)發(fā)送(提交)給頁面abc.php,其實也可以理解為“打開”該網頁(abc.php),還可以理解為“請求”該網頁(abc.php),這種請求也是get請求
不管哪種形式的get提交過來的數(shù)據(jù),獲取數(shù)據(jù)是一樣的:(在abc.php網頁中)
<?php
$v1 = $_GET[‘uName’]; //單引號也可以用雙引號,本質是一個字符串,其實是數(shù)組的鍵名(下標)
$v2 = $_GET[‘uPswd’]; //該鍵名必須跟提交的時候的名字完全一致(區(qū)分大小寫)
?>
下面例如輸出$_GET,首先是表單
<form action="get_1.php" method="get">
姓名:<input type="text" name="uName">
密碼:<input type="password" name="uPswd">
年齡:<input type="text" name="uAge">
<br>
愛好:
<input type="checkbox" name="uHobby[]" value="zuqiu" />足球
<input type="checkbox" name="uHobby[]" value="lanqiu" />籃球
<input type="checkbox" name="uHobby[]" value="yumaoqiu" />羽毛球
<br>
<input type="submit" value="提交">
</form>
php代碼
<?php
var_dump($_GET);
?>
最終輸出結果是
array(4) {
["uName"]=>
string(4) "Jens"
["uPswd"]=>
string(6) "123456"
["uAge"]=>
string(2) "21"
["uHobby"]=>
array(2) {
[0]=>
string(6) "lanqiu"
[1]=>
string(8) "yumaoqiu"
}
}
$_POST變量(數(shù)組)
類似$_GET變量(數(shù)組),$_POST代表頁面通過post方式提交過來的數(shù)據(jù)所形成的數(shù)組。
post提交數(shù)據(jù),通常只有一種形式:
<form action=”abc.php” method=”post” >
項目1: <input type=”text” name=”uName” />
項目2: <input type=”password” name=”uPswd” />
<input type=”submit” value=”提交” />
</form>
其作用是:用戶填寫表單數(shù)據(jù),并提交后,會將數(shù)據(jù)發(fā)送(提交)給頁面abc.php,其實也可以理解為“打開”該網頁(abc.php),還可以理解為“請求”該網頁(abc.php) 接收post數(shù)據(jù)的形式為:(在abc.php網頁中)
<?php
$v1 = $_POST[‘uName’]; //單引號也可以用雙引號,本質是一個字符串,其實是數(shù)組的鍵名(下標)
$v2 = $_POST[‘uPswd’]; //該鍵名必須跟提交的時候的名字完全一致(區(qū)分大小寫)
也可以顯示所有post數(shù)據(jù):
var_dump($_POST)
?>
通常,網頁中的form表單,一般都用post方式,get方式主要體現(xiàn)在其他3種形式。
$_REQUEST變量(數(shù)組)
$_REQUEST數(shù)組,其實并不是一個獨立的數(shù)據(jù)來源,而是$_POST數(shù)據(jù)和$_GET數(shù)據(jù)的“總和”即$_REQUEST數(shù)組中包括了所有$_POST數(shù)據(jù)和$_GET數(shù)據(jù)——其實是由系統(tǒng)內部自動存儲的。通常,$_POST數(shù)據(jù)和$_GET數(shù)據(jù)不會“同時出現(xiàn)”,$_REQUEST數(shù)組就代表了其中之一。
無論表單的提交方法是GET或POST,其接收的方式都是
$u = $_REQUEST['XXX'];
而get和post數(shù)據(jù)同時提交的情形
<form action="abc.php?a=5&b=10" method="POST" > ...
項目1: <input type=”text” name=”uName” />
項目2: <input type=”password” name=”uPswd” />
<input type=”submit” value=”提交” />
</form>
則此時,uName和uPswd兩個數(shù)據(jù)以post方式提交給abc.php,并,同時:a=5和b=10兩個數(shù)據(jù),以get方式提交給abc.php
則在頁面abc.php中:
//這樣取得get數(shù)據(jù):
$v1 = $_GET[‘a’];
$v2 = $_GET[‘b’];
//這樣取得post數(shù)據(jù):
$v3 = $_POST[‘uName’];
$v4 = $_POST[‘uPswd’];
//但,也可以這樣取(全有了):
$v1 = $_REQUEST[‘a’];
$v2 = $_REQUEST[‘b’];
$v3 = $_REQUEST[‘uName’]
$v4 = $_REQUEST[‘uPswd’]
當get數(shù)據(jù)和post數(shù)據(jù)同時提交并其中有重名的時候,情況怎么樣呢?
- 盡量避免重名;
- 如果重名了,此時$_REQUEST只會記錄(存儲)其中一個數(shù)據(jù)(要么post數(shù)據(jù),要么get數(shù)據(jù))
- 至于記錄的是哪個,是有php.ini中的一個設置項來決定:
- request_order = “GP”; //這是默認值,G代表GET,P代表POST。含義是:先存儲GET數(shù)據(jù),再存儲POST
- 如果重名,此時POST就會覆蓋GET數(shù)據(jù),改為:request_order = “PG”, 順序反過來
$_GET, $_POST, $_REQUEST三種數(shù)據(jù)是相互獨立的。
$_SERVER變量(數(shù)組)
該變量存儲了服務器端或客戶端的一些請求信息或設置信息,比較多,而且不同的服務器和不同的請求頁面,其數(shù)據(jù)項都可能不同。
- 常用的有:
- REMOTE_ADDR, 用戶的IP地址
- SERVER_ADDR: 服務器端的IP地址
- SERVER_NAME: 服務器名(主機名)
- DOCUMENT_ROOT: 站點絕對路徑(其實就是主機設置中的DocumentRoot
- PHP_SELF:當前網頁的文件路徑
- QUERY_STRING: 表示一個get請求的整體字符串,類似這樣:
- http://www.abc.com/abc.php?a=5&b=10連接地址中的“a=5&b=10” 輸出所有項(可能每臺服務器有所差異)
輸出所有項的代碼
<?php
foreach ($_SERVER as $key => $value) {
echo $key . " ==> " . $value;
}
?>
$GLOBALS變量(數(shù)組)
似乎是一個多余的變量:它只是把我們自己定義的所有全局變量存儲到該數(shù)組中:變量名就是該數(shù)組的下標(鍵名),變量值就是對應的值。例如
<?php
$va1 = 1;
$va2 = "jehe";
var_dump($GLOBALS);
?>
則輸出的結果為
array(7) {
["GLOBALS"]=>
*RECURSION*
["_POST"]=>
array(0) {
}
["_GET"]=>
array(0) {
}
["_COOKIE"]=>
array(0) {
}
["_FILES"]=>
array(0) {
}
["va1"]=>
int(1)
["va2"]=>
string(4) "jehe"
}
常量
含義:用于存儲一個不會變化也不希望變化的數(shù)據(jù)的標示符。
常量命名規(guī)則,同變量,但習慣說,常常將常量的名稱使用“全大寫”形式。
定義形式
使用define()函數(shù)定義
- 使用形式:define(“常量名”, 常量值),推薦常用名使用全大寫形式
例如
define("PI",3.14);
echo PI;// 3.14
使用const語法定義
- 使用形式: const 常量名 = 常量值;
- 但const語法只能在“最頂層”的代碼域中使用(不能在大括號中),也即,const語法不能在函數(shù)中或條件語句中或其他表示一個“范圍”的語句中使用
例如
const PI = 3.14;
if(PI > 10){
const PW = 5;// 錯誤,只能定義在最頂部
}
使用常量
- 直接使用名字
- 使用constant()函數(shù):constant(“常量名”)
例如
<?php
define("PI",3.14);
echo(3.14);
echo(constant("PI"));
?>
常量變量的區(qū)別
- 定義形式不同:常量無需$符號
- 使用形式不同:常量無需$符號
- 可變程度不同:常量的值不可以改變,常量也不可以銷毀
- 作用范圍不同:常量具有超全局作用域 (函數(shù)內外都可以直接使用)
- 可用類型不同:常量只能存儲標量類型:int,float,string,bool
判斷常量是否存在
判斷的結果為布爾值。
常用形式:if ( defined (某常量名) == false ){ .....這里可以去定義該常量;}
實際上,可以這樣:
$result = defined (某常量名); //結果是true或false
使用一個未定義的常量(特殊情況)
使用一個未定義的常量會報一個錯誤(notice錯誤)——跟使用一個未定義的變量一樣——當然不推薦。但是:php,此時會得到一個意想不到的結果:似乎該常量存在,并該常量的值就是該名字。
預定義常量
php語言中,預定了大量的常量,可以直接使用。其中有些常量,是需要某些模塊打開之后才有(比如mysql模塊)
- 比如M_PI(圓周率), PHP_OS(操作系統(tǒng)), PHP_VERSION(php版本號),PHP_INT_MAX(php中的最大的整數(shù)值)
- 參考手冊〉附錄〉保留字列表〉預定義常量
魔術常量
魔術常量其實是一種值會隨著一定的條件(環(huán)境)而變化的常量,形式和使用上是常量,但實際上,其值會改變。
比如:__DIR__(當前網頁文件的所在目錄),__FILE__(當前網頁文件),__LINE__(當前這一行)
- 魔術常量其實類似變量,其值隨著不同代碼而變化,不區(qū)分大小寫
- 參考手冊〉語言參考〉常量〉魔術常量
例如:
<?php
echo __DIR__;
echo "<br />";
echo __FILE__;
echo "<br />";
echo __LINE__;
?>
輸出結果為
D:\PHP\demo2
D:\PHP\demo2\get_1.php
6