PHP基礎
服務端web開發(fā)
在講解什么是服務端開發(fā)之前,讓我們先思考幾個問題:
-
網(wǎng)站訪問:當我們做好了.html的網(wǎng)站,如何讓別人(朋友,用戶)可以訪問到呢?
- 使用U盤拷貝,QQ發(fā)送文件等直接將文件共享的方式?---不靈活;
- 將網(wǎng)站放在服務器上,讓用戶通過網(wǎng)址訪問?---絕大多數(shù)網(wǎng)站的做法。
-
網(wǎng)站內容更新:如果用戶每次訪問我們的網(wǎng)站看到的內容都是一樣的,在最初的新鮮勁過去以后估計就再也不想訪問我們的網(wǎng)站了o(╯□╰)o,那么如何去更新網(wǎng)站的內容呢?
- 當有內容、圖片,或者界面需要更新時,直接修改.html文件?---費時費力;
- 通過某種手段,當有新的消息,自動的完成網(wǎng)站的更新?---動態(tài)網(wǎng)站。
-
如何實現(xiàn)網(wǎng)站動態(tài)化:網(wǎng)站的本質,其實就是一堆按照某種規(guī)則排列的字符串而已,如果我們可以通過某種方式,讓電腦
動態(tài)
生成這些字符串,是不是就實現(xiàn)了網(wǎng)站的動態(tài)化?- 想要讓電腦干事情,可以通過
編程語言
來實現(xiàn); - 編程語言的編寫位置為
服務器
,因為用戶是向服務器要網(wǎng)站的; - 在服務器,通過
編程語言
讓用戶訪問的網(wǎng)站動態(tài)化
叫做:服務端web開發(fā)
。 - web服務器:提供了web服務的計算機;請求的是HTML:讀取并返回、在服務端一般不會對這個html頁面進行任何操作;web后臺開發(fā):本質是動態(tài)生成html、css、js。
- 想要讓電腦干事情,可以通過
可選開發(fā)方式:雖然基本上所有可以返回字符串的編程語言都能夠實現(xiàn)這個功能,目前市場主流開發(fā)語言有:
Java、PHP、ASP、.Net、Ruby、Python、Erlang
等。雖然可以選擇的開發(fā)語言有很多種,但是本質都是一樣的:當用戶訪問網(wǎng)站了,根據(jù)
某些邏輯
,生成對應的HTML、CSS、JS
代碼給用戶。
PHP簡介
PHP在眾多的編程語言中,是比較容易上手,結合我們搭建的WAMP環(huán)境就能夠開始學習了。
PHP代碼執(zhí)行方式:服務端web編程寫好的代碼,需要通過瀏覽器訪問服務器,在服務器端執(zhí)行,然后返回給用戶結果,如果直接使用瀏覽器打開,就會解析為文本。
PHP常見語法
這里只列舉常用的PHP語法,更為詳細的語法教程可以查閱:http://www.w3school.com.cn/php/index.asp
注意點:
必須放在服務器配置的網(wǎng)站目錄中;
不要直接用sublime、webstorm運行;
必須寫在
<?php ?>
標簽中;執(zhí)行的位置是在服務端需要通過瀏覽器請求
.php
頁面才能夠執(zhí)行;php的邏輯代碼不會輸出,僅僅只會返回執(zhí)行完畢的結果。
文件定義、注釋:PHP文件以
.php
結尾,代碼的編寫位置在<?php 寫在這里?>
,注釋的寫法跟js一致:
<?php
//這是單行注釋
/*
這是多行注釋
*/
?>
PHP變量規(guī)則:
變量以
$
符號開頭,其后是變量的名稱;變量名稱必須以字母或下劃線開頭:
$a;
、$b;
、$a1;
、$_abc
;變量名稱不能以數(shù)字開頭;
變量名稱只能包含字母、數(shù)字和下劃線(
A-z
、0-9
以及_
);變量名稱對
大小寫敏感
($y
與$Y
是兩個不同的變量)。-
補充:
- 下面這些是錯誤的變量定義:
$1;
、$哈哈;
、$^&*;
; - 下面定義的兩個變量是不同的,大寫,小寫x:
$x;
、$X;
。
- 下面這些是錯誤的變量定義:
數(shù)據(jù)類型
PHP支持的數(shù)據(jù)類型包括:
字符串、整數(shù)、浮點數(shù)、布爾、數(shù)組、對象、NULLL
(注:由于對象中可以使用函數(shù),故對象的語法在下文中會提及);-
定義字符串時需要注意:
- 單引號:
''
,內部的內容只是作為字符串; - 雙引號:
""
,如果內部是PHP的變量,那么會將該變量的值解析;
- 單引號:
字符串連接
:不同于JavaScript,PHP中使用.
進行連接
// 字符串
$str = '123';
// 字符串連接
$str2 = '123'.'哈哈哈';
// 整數(shù)
$numA = 1; //正數(shù)
$numB = -2;//負數(shù)
// 浮點數(shù)
$x = 1.1;
// 布爾
$a = true;
$b = false;
// 普通數(shù)組:數(shù)組中可以放數(shù)字、字符串、布爾值等等不限制類型
$arr = array('123',123)
//取數(shù)組里的數(shù)據(jù)
$arr[1];
// 關系型數(shù)組:類似于json的格式,但是不是“:”,而是使用“=>”分隔鍵值對,獲取通過“["key"]”即可獲取
$person = array('name'=>'小李子','age'=>'35','skill'=>'發(fā)福');
echo $person['skill'];
- 運算符:PHP中的運算符跟JavaScript中的基本一致,用法也基本一致:
- 算數(shù)運算符:
+、-、/、*、%
; - 賦值運算符:
x = y、x += y、x -= y
, 注:這里列舉的并不完全,更為詳細的PHP運算符教程請查閱:http://www.w3school.com.cn/php/php_operators.asp
<?php
$x=10;
$y=6;
echo ($x + $y); // 輸出 16
echo ($x - $y); // 輸出 4
echo ($x * $y); // 輸出 60
echo ($x / $y); // 輸出 1.6666666666667
echo ($x % $y); // 輸出 4
?>
- 函數(shù):PHP雖然系統(tǒng)內建了一些函數(shù),但是這不影響我們定義自己的。函數(shù)的作用就是在代碼中可以重復使用的語法塊,頁面加載的時候不會執(zhí)行,只有在被調用的時候才會執(zhí)行;
// 基礎語法
function functionName() {
//這里寫代碼
}
// 無參數(shù) 無返回值的函數(shù)
function sayhi(){
echo "Hello World";
}
// 有參數(shù) 無返回值的函數(shù)
function sayName($name){
echo $name.'你好哦';
}
// 調用
sayName('小狐貍');
// 有參數(shù),參數(shù)有默認值的函數(shù)
function sayFood($food='西蘭花'){
echo $food.'好好吃';
}
// 調用
sayFood('西葫蘆');// 如果傳入?yún)?shù),就使用傳入的參數(shù)
sayFood();// 如果不傳入?yún)?shù),直接使用默認值
// 有參數(shù),有返回值的函數(shù)
function sum($a,$b){
return $a+$b
}
sum(1,2);// 返回值為1+2 = 3
- 對象:PHP中允許使用對象這種自定義數(shù)據(jù)類型;使用時必須先
聲明
,實例化
之后才能夠進行使用:
// 定義最基礎的類
class Fox{
public $name = 'tangtang';
public $age = 10;
}
$fox = new Fox;
// 對象屬性取值
$name = $fox->name;
// 對象屬性賦值
$fox->name = '小狐貍';
// 帶構造函數(shù)的對象
class fox{
// 私有屬性,外部無法訪問
var $name = '小狐貍';
// 定義方法 用來獲取屬性
function Name(){
return $this->name;
}
// 構造函數(shù),可以傳入?yún)?shù)
function fox($name){
$this->name = $name
}
}
// 定義了構造函數(shù) 需要使用構造函數(shù)初始化對象
$fox = new fox('小狐貍');
// 調用對象方法,獲取對象名
$foxName = $fox->Name();
- 內容輸出:
echo
,PHP語句直接使用即可;輸出字符串推薦使用print_r();
函數(shù);輸出復雜數(shù)據(jù)類型,比如數(shù)組,對象,推薦使用var_dump();
函數(shù)輸出詳細信息:
$arr =array(1,2,'123');
echo '123';
// 結果為 123
print_r($arr);
// 結果為 Array ( [0] => 1 [1] => 2 [2] => 123 )
var_dump($arr);
/* 結果為
array
0 => int 1
1 => int 2
2 => string '123' (length=3)
*/
- 邏輯語句:和js中的一樣;
- if...else...
$sex = "man";
if ($sex == "man"){
echo "男生";
}else {
echo "女生";
}
- switch...case...
$day = "friday";
switch($day){
case "monday":
echo "感覺自己被床封印了";
break;
case "friday":
echo "哇塞,明天就可以休息咯";
break;
default:
echo "感覺自己被掏空";
break;
}
- 循環(huán)語句:
- for循環(huán):
for ($x=0; $x<=10; $x++) {
echo "數(shù)字是:$x <br>";
}
- foreach;
$colors = array("red","green","blue","yellow");
// 參數(shù)1為循環(huán)的對象,參數(shù)2會將對象的值挨個取出,直到最后
// 如果循環(huán)的是對象的話,輸出的是對象屬性的值
foreach ($colors as $value) {
echo "$value <br>";
}
輸出結果為
/*
red
green
blue
yellow
*/
- while循環(huán):
$num = 0;
while($num <= 10){
echo "報數(shù):"."$num"."<br>";
$num++;
}
- 三元表達式:
$a1 = $a0>2 ? 5:0;
。
header()函數(shù)
- php中告訴瀏覽器按照哪種文本編碼解析,是php中直接幫助我們定義好的函數(shù),直接使用即可;
- 用來向客戶端(瀏覽器)發(fā)送報頭,如果出現(xiàn)中文無法顯示,可以嘗試在PHP代碼頂部添加如下代碼設置文本編碼:
- 設置編碼格式為:utf-8:
header("content-type:text/html; charset=utf-8");
- 設置頁面跳轉:
- 設置跳轉到百度首頁:
header("location:http://www.baidu.com");
- 設置頁面間隔刷新:
header("refresh:3;url=http://www.taobao.com");
網(wǎng)絡數(shù)據(jù)提交
PHP$_GET
數(shù)據(jù)獲取
關于
$_GET
:獲取get的數(shù)據(jù);
php幫我們準備好的超全局對象;
關系型數(shù)組,取值用的是key;
跟提交過來的key是相對的,key是表單元素的name屬性;
有數(shù)據(jù)大小限制,url長度是有限的。
在PHP中,如果想要獲取通過
get
方法提交的數(shù)據(jù),可以通過$_GET
對象來獲取(雖然參數(shù)在地址欄中可以查看);通過
$_GET['key']
即可獲取數(shù)據(jù),key是提交的時候表單元素的name屬性值。如果想要提交數(shù)據(jù):
form標簽必須要有action屬性;
method=get,不設置默認是get;
form表單中的表單元素必須要有
name
屬性。HTML代碼:下面就是一個簡單的表單代碼,將數(shù)據(jù)提交到01.php,使用get的方式:
<form action="01.php" method="get" >
<label for="">姓名:
<input type="text" name="userName">
</label>
<br/>
<label for="">郵箱:
<input type="text" name= "userEmail">
</label>
<br/>
<input type="submit" name="">
</form>
- PHP代碼:
<?php
echo "<h1>GET_PAGE</h1>";
echo 'userName:'.$_GET['userName'];
echo '<br/>';
echo 'userEmail:'.$_GET['userEmail'];
?>
PHP$_POST
數(shù)據(jù)獲取
關于
$_POST
:獲取post的數(shù)據(jù);
php幫我們準備好的超全局對象;
關系型數(shù)組,取值用的是key;
跟提交過來的key是相對的,key是表單元素的name屬性;
提交的數(shù)據(jù)大小是沒有限制的,用來上傳文件給服務器。
在PHP中,如果想要獲取通過post方法提交的數(shù)據(jù),可以通過
$_POST
對象來獲取;HTML代碼:下面就是一個簡單的表單代碼,將數(shù)據(jù)提交到02.php,使用post的方式(注意:代碼中的method改為post)
<form action="02.php" method="post" >
<label for="">姓名:
<input type="text" name= "userName">
</label>
<br/>
<label for="">郵箱:
<input type="text" name= "userEmail">
</label>
<br/>
<input type="submit" name="">
</form>
- PHP代碼:
<?php
echo "<h1>POST_PAGE</h1>";
echo 'userName:'.$_POST['userName'];
echo '<br/>';
echo 'userEmail:'.$_POST['userEmail'];
?>
POST&GET錯誤處理
- 當我們直接訪問POST&GET頁面時由于并沒有傳遞任何數(shù)據(jù),會因為
$_GET
或$_POST
不存在對應的key而報錯。 - 處理方式:使用
array_key_exists(key, 數(shù)組)
函數(shù)來進行判斷: - 參數(shù)1:要檢測的key字符串;
- 參數(shù)2:檢驗的數(shù)組;
if(array_key_exists('name', $_GET)){
//如果有數(shù)據(jù),再去讀取
}else{
// 反之,可以執(zhí)行一些其他的邏輯
}
GET和POST的區(qū)別:
get:
url能夠看到參數(shù);
有數(shù)據(jù)大小限制;
url長度是有限制的。
post:
url看不到;
提交的數(shù)據(jù)大小是沒有限制的(相對而言,一般是在服務端配置限制);
用來上傳文件給服務器。
php在實際開發(fā)中的使用方式
- 會嵌入到前端工程師寫好的.html中,注意:需要把html后綴給成php;
- 在希望被替換的位置使用
<?php php代碼?>
進行占位,就能夠根據(jù)用戶提交的數(shù)據(jù)動態(tài)生成界面。
PHP文件上傳處理01-$_FILES
對象(上傳文件)
php中上傳的文件,會先以臨時文件的方式保存起來,我們將其移動到其他的位置即可;
在PHP中能夠通過
$_FILE
獲取上床的文件;瀏覽器端(客戶端)部分代碼:
注1:form提交數(shù)據(jù)需要使用
POST
提交;注2:在input標簽里,type=file;
注3:在form中提交數(shù)據(jù)時,需要在form表單中添加
enctype="multipart/form-data"
屬性;HTML代碼:
<form action="03.fileUpdate.php" method="post" enctype="multipart/form-data">
<label for="">照片:
<input type="file" name = "picture">
</label>
<br/>
<input type="submit" name="">
</form>
- 服務端代碼:
-
$_FILES
(可以同時獲取多個上傳的文件)用法跟$_GET
,$_POST
類似,都是關系型數(shù)組; -
#_FILE['key']
:可以獲取對應上傳的文件
的具體信息(里面包含文件名,臨時文件等),這里的key
跟提交時的name
相對應; -
#_FILE['key']['name']
可以獲取上傳的文件名
; -
#_FILE['key']['tmp_name']
可以獲取上傳的文件保存的臨時目錄
;
<?php
sleep(5);//單位秒。 在臨時保存的文件夾里面看不到東西,因為立刻就被刪除了,提交之后讓服務器休息一會,可以看到臨時文件夾里面的文件
print_r($_FILES);//可以打印 $_FILES的所有信息
?>
- 現(xiàn)象:
- 點擊提交后,服務器沒有立即出現(xiàn)反應,而是休息了一會sleep(5);
- 在wamp/tmp目錄下面出現(xiàn)了一個
.tmp
文件; -
.tmp
文件一會就被自動刪除了; - 服務器返回的內容中,有文件的名字[name] => computer.png,以及上傳文件保存的位置D:\wamp\tmp\php3D70.tmp
PHP文件上傳處理02-移動文件
剛剛演示了
$_FILES
對象的作用,以及PHP接受上傳文件時,會先保存在一個臨時目錄下,那么接下來我們就演示如何將臨時目錄下面的文件保存起來;上傳的臨時文件,一會就會被自動刪除,我們需要將其移動到保存的位置;
HTML代碼:這部分的代碼不需要改變
<form action="03.fileUpdate.php" method="post" enctype="multipart/form-data">
<label for="">照片:
<input type="file" name = "picture">
</label>
<br/>
<input type="submit">
</form>
- PHP代碼
move_uploaded_file()
這個函數(shù)可以處理文件,詳情參考:http://www.w3school.com.cn/php/func_filesystem_move_uploaded_file.asp
Array ( [picture] => Array (
[name] => computer.png
[type] => image/png
[tmp_name] => D:\wamp\tmp\php8913.tmp
[error] => 0 [size] => 5212 )
)
- 其中我們需要通過picture(根據(jù)表單標簽的name屬性決定)獲取臨時文件名以及上傳文件名;
<?php
sleep(5);// 讓服務器休息一會,方便我們查看上傳的臨時文件
// 第一個參數(shù)是:要移動的文件
// 第二個參數(shù)是:目標位置(寫的是相對路徑,相對于該php文件的路徑)
move_uploaded_file($_FILES['picture']['tmp_name'], './upload/'.$_FILES['picture']['name']);
?>
PHP設置上傳文件的大小
- 默認支持的最大上傳文件大小為10兆,在使用wamp過程中,如果想要修改上傳的文件大小,需要如何設置呢?
修改php.ini
- 步驟:
- 左鍵點擊wamp;
- 選擇php;
- 在彈出的窗口中選擇
php.ini
; - 在打開的文件中進行修改,具體修改的地方如下“修改內容”;
- 修改完畢,保存并重啟wamp。
修改內容
- 使用文本編輯工具的搜索功能找到下列選項 進行修改:
- 設置文件最大上傳限制(值的大小可以根據(jù)需求修改)
file_uploads = On; //是否允許上傳文件 On/Off 默認是On
upload_max_filesize = 32M; //上傳文件的最大限制
post_max_size = 32M; //通過Post提交的最多數(shù)據(jù)
- 考慮網(wǎng)絡傳輸快慢,這里修改一些參數(shù):
max_execution_time = 30000; //腳本最長的執(zhí)行時間,單位為秒
max_input_time = 600; //接收提交數(shù)據(jù)的時間限制,單位為秒
memory_limit = 1024M; //最大的內存消耗
PHP與js的區(qū)別:
- 定義變量:$a;
- 拼接字符串:使用點.;
- 數(shù)組:array("abc",111);array('a'=>111,'b'=>222);
- 雙引號使用有區(qū)別。