[TOC]
1. PHP引用變量的概念以及定義方式
概念:在PHP中引用意味著用不同的名字訪問同一個變量的內(nèi)容。
定義方式:&
工作原理:
<?php
// 定義一個變量
$a = range(0, 1000);
var_dump(memory_get_usage());
// 定義變量b,并把a(bǔ)賦值給b
// COW Copy On Write
$b = $a; // $b 與 $a共享一塊空間
var_dump(memory_get_usage());
// 對a進(jìn)行修改
$a = range(0, 1000); // 有修改沦泌,會Copy $a空間
var_dump(memory_get_usage());
memory_get_usage():查看使用的內(nèi)存空間
COW:對變量進(jìn)行修改才會Copy骄酗,但是對對象象的屬性進(jìn)行修改時不會進(jìn)行復(fù)制衫生,
所以內(nèi)存表現(xiàn)如下:
在內(nèi)存中表現(xiàn)形式如下:
// 定義一個變量
$a = range(0, 1000);
// 定義變量b媳溺,并把a(bǔ)賦值給b
$b = &$a;
// 對a進(jìn)行修改
$a = range(0, 1000);
在內(nèi)存中表現(xiàn)形式如下:
說明:
① unset():只會取消引用洞渤,而不會銷毀空間
② 對象本身就是引用傳遞
實(shí)例
寫出下列程序的輸出結(jié)果况既。
$data = ['a', 'b', 'c'];
foreach ($data as $key=>$val) {
$val = &$data[$key];
}
- 每一次循環(huán)結(jié)束后这溅,$data的值是什么?
-
程序執(zhí)行完了之后棒仍,變量$data的值是什么悲靴? ['b', 'c', 'c']
image.png
2. 常量及數(shù)據(jù)類型
數(shù)據(jù)類型(8大數(shù)據(jù)類型)
字符串
PHP中字符串可以使用哪三種定義方式?他們之間的區(qū)別降狠。
- ''
- ""
- heredoc和newdoc
區(qū)別:
單引號:
- 單引號不能解析變量
- 單引號不能解析轉(zhuǎn)義字符对竣,只能解析單引號和反引號本身
- 變量和變量庇楞、變量和字符串、字符串和字符串之間可以使用
.
連接
雙引號:
- 雙引號可以解析變量否纬,變量可以使用特殊字符(如:&)和
{}
包含 - 雙引號可以解析所有轉(zhuǎn)義字符
- 字符串連接
單引號的效率高于雙引號吕晌。
heredoc:類似于雙引號
$str = <<<EOT
內(nèi)容
EOT;
newdoc:類似于單引號
heredoc和newdoc都是用來處理大文本的。
常量
定義常量
- const
- define
①
const
更快临燃,是語言結(jié)構(gòu)睛驳,而define
是函數(shù)。
②define
不能用于類常量的定義膜廊,const
可以
③ 常量一經(jīng)定義乏沸,不能被修改、刪除
預(yù)定義常量(魔術(shù)常量):
-
__FILE_
_:文件的完整路徑和文件名 -
__LINE__
:文件中當(dāng)前行號 -
__DIR__
:文件所在目錄 -
__FUNCTION__
:函數(shù)名稱 -
__CLASS__
:類的名稱 -
__TRAIT__
:Trait的名字 -
__METHOD__
:類的方法名稱 -
__NAMESAPCE__
:當(dāng)前命名空間的名稱
真題:
- 用PHP寫出顯示客戶端IP和服務(wù)器IP的代碼爪瓜。
-
__FILE__
表示什么意思蹬跃?
// 客戶端IP
$_SERVER['REMOTE_ADDR'];
$_SEVER['SERVER_ADDR'];
`__FILE_`_:文件的完整路徑和文件名
3. 運(yùn)算符
真題:
foo()
和@foo()
之間的區(qū)別。
@:錯誤控制符铆铆。
當(dāng)將放置在一個PHP表達(dá)式之前蝶缀,則該表達(dá)式可能產(chǎn)生的任何錯誤信息都會被忽略掉。
運(yùn)算符的優(yōu)先級
文檔地址:官方文檔
比較運(yùn)算符
==和===的區(qū)別
等值判斷(false的7種情況)
遞增/遞減運(yùn)算符
- 遞增/遞減運(yùn)算符不影響布爾值(true++無效)
- 增減NULL值沒有效果
- 遞增NULL值為1
- i++/++i
邏輯運(yùn)算符
- 短路作用
- ||薄货、&&與or翁都、and的優(yōu)先級不同
$a == true || $b == 3 // 前面為true,后面的不會執(zhí)行了
4. 流程控制
遍歷數(shù)組的三種方式及各自的區(qū)別谅猾。
- for
- foreach
- while柄慰、list()、each()組合
for只能遍歷索引數(shù)組税娜,foreach可以遍歷索引坐搔、關(guān)聯(lián)數(shù)組,聯(lián)合使用list()敬矩、each()和while同樣可以遍歷索引薯蝎、關(guān)聯(lián)數(shù)組。
while谤绳、list()、each()組合不會reset()重置
foreach會對數(shù)組進(jìn)行reset()操作
分支結(jié)構(gòu):
- if
- if ... else ...
- switch ... case
5. 自定義函數(shù)和內(nèi)部函數(shù)
真題:
寫出以下程序的輸出結(jié)果:
$count = 5;
function get_count () {
static $count; // 局部變量袒哥,沒有初始化值缩筛,為null
return $count++; // null++ == 1,因?yàn)?+在后面堡称,所以第一次調(diào)用這返回null
}
echo $count; // 5
++$count; // 6
echo get_count(); // NULL-->不會輸出
echo get_count(); // 1
結(jié)果:
51
考點(diǎn):
- 變量的作用域和靜態(tài)變量
- 延伸:函數(shù)的參數(shù)以及參數(shù)的引用傳遞
- 延伸:函數(shù)的返回值及引用返回
- 延伸:外部文件的引入
- 延伸:系統(tǒng)內(nèi)置的函數(shù)
變量的作用域及靜態(tài)變量
變量的作用域
變量的作用域:也稱變量的范圍瞎抛,變量的范圍即它定義的上下文背景。大部分的PHP變量是有一個單獨(dú)的范圍却紧。這個單獨(dú)的范圍跨度同樣包含include
和require
引入的文件桐臊。
- global
- $GLOBALS超全局?jǐn)?shù)組
$str = "outer"; // 全局變量
function fun() {
echo $str; // 局部變量胎撤,這里會報錯Undefined variable
}
fun();
如果要在函數(shù)內(nèi)部使用$str變量,我們可以使用global
關(guān)鍵字断凶。
$str = "outer"; // 全局變量
function fun() {
global $str;
// 以下兩種方式都可以用
echo $str;
echo $GLOBALS['str'];
}
fun();
靜態(tài)變量
靜態(tài)變量僅在局部函數(shù)中存在伤提,但當(dāng)程序執(zhí)行離開此作用域時,其值并不會消失认烁。
static修飾的變量的特點(diǎn):
- 僅初始化一次
- 初始化時需要賦值
- 每次執(zhí)行函數(shù)該值會保留
- static 修飾的變量是局部的肿男,僅在函數(shù)內(nèi)部有效
- 可以記錄函數(shù)的調(diào)用次數(shù),從而可以在某些條件下終止遞歸
function fun() {
static $a = 1; // 只會申明一次
echo $a++;
}
fun(); // 1
fun(); // 2
fun(); // 3
函數(shù)的參數(shù)以及參數(shù)的引用傳遞
函數(shù)的參數(shù)
默認(rèn)情況下却嗡,函數(shù)的參數(shù)通過值傳遞舶沛。
如果希望允許函數(shù)修改它的值,必須通過引用傳遞參數(shù)窗价。
** 值傳遞:**
$a = 1;
function func( $a ) {
$a = 2;
}
func( $a );
echo $a; // 1
在函數(shù)內(nèi)部如庭,修改不了全局變量$a
的值
引用傳遞
$a = 1;
function func( &$a ) {
$a = 2;
}
func( $a );
echo $a; // 2
修改了全局變量$a
的值
函數(shù)的返回值及引用返回
返回值:
值通過使用可選的返回語句(return)返回
可以返回包括數(shù)組和對象的任意類型
返回語句會中止函數(shù)的執(zhí)行,將控制權(quán)交回函數(shù)調(diào)用處
省略return撼港,返回值為NULL坪它,不可返回多個值
引用返回:
從函數(shù)返回一個引用,必須在函數(shù)申明和指派返回值給一個變量是都使用引用運(yùn)算符&
餐胀。
function &a() {
static $b = 10;
return $b;
}
echo a(); // 10哟楷,函數(shù)正常調(diào)用
$a = &a();
$a = 100;
echo $a; // 100
延伸:外部文件的引入
include、require語句包含并運(yùn)行指定文件
如果給出路徑名按照路徑來找否灾,否則從include_path中查找卖擅;如果include_path中沒有,則從調(diào)用腳本文件所在的目錄和當(dāng)前工作目錄下尋找墨技。
當(dāng)一個文件被包含時惩阶,其中所包含的代碼繼承了include所在行的變量范圍。
加載過程中未找到文件則include結(jié)構(gòu)會發(fā)出一個警告扣汪,而require則會發(fā)出一個致命錯誤断楷。腳本終止。
require(include)/ require_onece(include_once)唯一的區(qū)別是PHP會檢查該文件是否已經(jīng)被包含過崭别,如果是則不會再次包含冬筒。
延伸:系統(tǒng)內(nèi)置的函數(shù)
時間日期函數(shù)
date()、strtotime()茅主、mktime()舞痰、time()、microtime()诀姚、date_default_timezone_set()
IP處理
ip2long()响牛、long2ip()
打印處理
print()、printf()、print_r()呀打、echo矢赁、sprintf()、var_dump()贬丛、var_export()
var_dump():會打印出數(shù)據(jù)類型
print_r():標(biāo)量類型則原來的值撩银,將數(shù)組格式化輸出
var_export():返回的結(jié)果與print_r()類似,但是var_export()
返回的是合法的PHP代碼(返回的值可以當(dāng)做數(shù)據(jù)使用)
字符串處理函數(shù)
implod()瘫寝、explode()蜒蕾、join()、strtev()焕阿、trim() ...
數(shù)組處理函數(shù)
array_keys()咪啡、array_values()、array_diff() ...
6. 正則表達(dá)式
作用:分割暮屡、查找撤摸、匹配、替換褒纲。
后向引用
$str = "<b>abc</b>";
$pattern = '/<b>(.*)<\/b>/';
$a = preg_replace($pattern, '\\1', $str);
echo $a;
貪婪模式
$str = "<b>abc</b><b>def</b>";
$pattern = '/<b>.*?<\/b>/';
$a = preg_replace_all($pattern, '\\1', $str);
常見的正則函數(shù)
preg_match()准夷、preg_match_all()、preg_replace()莺掠、preg_split()
中文匹配
UTF-8漢字編碼范圍是0x4e00-0x9fa5衫嵌,需要使用u模式修正符;
ANSI(gb2312)環(huán)境下:0xb0-0xf7,0xa1-0xfe彻秆,需要使用chr將ASCII碼轉(zhuǎn)換為字符楔绞。
$str = "中文";
$pattern = '/[\x{4e00}-\x{9fa5}]+/u'; // UTF-8
$pattern = '/['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chr(0xfe).']/'; //GB2312
preg_match($pattern, $str, $m);
var_dump($m);
/**
* array(1) {
[0]=>string(6) "中文"
}
*/
常見的正則表達(dá)式:URL、Email唇兑、IP酒朵、手機(jī)號
栗子:
匹配所有img
標(biāo)簽中的src的值。
$img = '<img alt="image" id="nav" src="av.png"/>';
$pattern = '/<img.*?src="(.*?)".*?\/?>/i';
preg_match($pattern, $img, $ma);
var_dump($ma);
/**
array(2) {
[0]=>string(40) "<img alt="image" id="nav" src="av.png"/>"
[1]=>string(6) "av.png"
}
*/
7. 文件及目錄處理
文件讀取/寫入
fopen():打開一個文件扎附,打開模式——r/r+
蔫耽、w/w+
、a/a+
留夜、x/x
匙铡、b
、t
fclose():關(guān)閉一個文件
不需要fopen()打開的函數(shù)
file_get_contents()
file_put_contents()
其他讀取函數(shù)
file()
readfile()
訪問遠(yuǎn)程文件
開啟allow_url_fopen碍粥,HTTP協(xié)議連接只能使用只讀慰枕,FTP協(xié)議可以使用只讀或只寫。
目錄操作函數(shù)
名稱相關(guān):basename()即纲、dirname()、pathinfo()
目錄讀炔├摺:opendir()低斋、readdir()蜂厅、closedir()、rewinddir()
目錄刪除:rmdir()
目錄創(chuàng)建:mkdir()
其他函數(shù)
文件大胁渤搿:filesize()
目錄大芯蛟场:disk_freee_space()、disk_total_space()
文件拷貝:copy()
刪除文件:unlink()
文件類型:filetype()
重命名文件或者目錄:rename()
文件截却娇纭:ftruncate()
文件屬性:file_exists()稠通、is_readable()、is_writable()买猖、is_executable()改橘、filectime()、fileatime()玉控、filemtime()
文件鎖:flock()
文件指針:ftell()飞主、fseek()、rewind()
真題
將文件的內(nèi)容讀取出來高诺,在開頭文件加入Hello World
$file = './04.php';
$handle = fopen($file, 'r');
$content = fread($handle, filesize($file));
$content = 'Hello World'.$content;
fclose($handle);
$handle = fopen($file, 'w');
fwrite($handle, $content);
fclose($handle);
通過PHP函數(shù)的方式目錄進(jìn)行遍歷
$dir = './test';
function loopDir($dir){
$handle = opendir($dir);
while (false != ($file = readdir($handle))) {
if ($file != '.' && $file != '..') {
echo $file."\n";
if (filetype($dir.'/'.$file) == 'dir' ) {
loopDir($dir.'/'.$file);
}
}
}
}
loopDir($dir);
8. 會話控制
實(shí)現(xiàn)方式:
- GET參數(shù)傳遞(不建議使用)
- Cookie(存儲在客戶端瀏覽器)
- Session(存儲在服務(wù)器)
Cookie
操作
- 設(shè)置:setcookie($name, $value, $expire, $path, $domain, $secure, $httponly)
- 讀:$_COOKIE
- 刪除:setcookie($name, '', now()-1000)
優(yōu)點(diǎn)和缺點(diǎn)
缺點(diǎn):
- 大小被限制
- 不安全碌识,有用戶篡改cookie的風(fēng)險
- 用戶禁用cookie,則該功能失效
優(yōu)點(diǎn):
- 不消耗服務(wù)器的任何資源
- 數(shù)據(jù)持久性
- 可配置cookie到期規(guī)則
Session
Session是基于Cookie的虱而。存儲在服務(wù)器筏餐。
操作
- 開啟session:session_start()
- $_SESSION
- 清空SESSION:$_SSEION = []
- 銷毀session文件:session_destroy()
SESSION配置
session.auto_start = 0
session.cookie_path = /
session.cookie_domain =
session.name
session.save_path
session.use_cookies
session.use_trans_sid
/垃圾回收/
session.gc_probability
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.save_handler = files
Session的優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):安全
缺點(diǎn):占用系統(tǒng)資源、分布式問題(使用Redis)
9. 面向?qū)ο?/h1>
PHP的類全新控制修飾符
- public
- protected
- private
延伸:面向?qū)ο蟮姆庋b牡拇、繼承魁瞪、多態(tài)
封裝:成員訪問權(quán)限控制
繼承:單一繼承、方法重寫(Parent::)
多態(tài):抽象類的定義诅迷、接口的定義
延伸:魔術(shù)方法
- __construct()
- __destruct()
- __call()
- __callStatic()
- __get()
- __set()
- __isset()
- __unset()
- __sleep()
- __wakeup()
- __toString()
- __clone()
延伸:設(shè)計(jì)模式
常見的設(shè)計(jì)模式:工廠模式佩番、單例模式、注冊樹模式罢杉、適配器模式趟畏、觀察者模式、策略模式滩租。
10. 網(wǎng)絡(luò)協(xié)議
真題
HTTP/1.1中赋秀,狀態(tài)碼 200、301律想、304猎莲、403、404技即、500的含義
HTTP協(xié)議狀態(tài)碼
負(fù)責(zé)HTTP響應(yīng)的返回結(jié)果著洼,標(biāo)記服務(wù)器端的處理是否正常,通知發(fā)生的錯誤。
五大類:
- 1xx:信息類狀態(tài)碼
- 2xx:成功狀態(tài)碼
- 3xx:重定向
- 4xx:客戶端請求錯誤
- 5xx:服務(wù)器錯誤
創(chuàng)建的狀態(tài)碼:
- 200身笤、204豹悬、206
- 301、302液荸、303瞻佛、304、307
- 400娇钱、401伤柄、403、404文搂、
- 500适刀、503
延伸:OSI七層模型
物數(shù)網(wǎng)傳會表應(yīng)
物理層、數(shù)據(jù)鏈路層细疚、網(wǎng)絡(luò)層蔗彤、傳輸層、會話層疯兼、表示層然遏、應(yīng)用層
- 物理層:建立、維護(hù)吧彪、斷開物理連接
- 數(shù)據(jù)鏈路層:建立邏輯連接待侵、進(jìn)行硬件地址尋址、差錯校驗(yàn)等功能
- 網(wǎng)絡(luò)層:進(jìn)行邏輯地址尋址姨裸、實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇
- 傳輸層:定義傳輸數(shù)據(jù)的協(xié)議端口秧倾、以控制和差錯校驗(yàn),協(xié)議有:TCP傀缩、UDP
- 會話層:建立那先、管理、終止會話
- 表示層:數(shù)據(jù)的表示赡艰、安全售淡、壓縮
- 應(yīng)用層:網(wǎng)絡(luò)服務(wù)與用戶的接口。常見的協(xié)議:HTTP慷垮、FTP揖闸、TFTP、SMTP料身、SNMP汤纸、DNS、HTTPS ...
延伸:HTTP協(xié)議的工作特點(diǎn)和工作原理
工作特點(diǎn):
- 基于B/S模式
- 通信開銷小芹血、簡單快遞贮泞、傳輸成本低
- 使用靈活楞慈、可食用超文本傳輸協(xié)議
- 節(jié)省存儲時間
- 無狀態(tài)
工作原理:
[圖片上傳失敗...(image-eae31a-1524021850714)]
延伸:HTTP協(xié)議常見請求/響應(yīng)頭和請求方法
HTTP協(xié)議常見請求/響應(yīng)頭
- Content-Type
- Accept
- Origin
- Cookie
- Cache-Control
- User-Agent
- Referrer
- X-Forwarded-For
- Accsess-Control-Allow-Origin
- Last-Modified
請求方法
- GET:一般用于獲取數(shù)據(jù)
- POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請求。一般用于數(shù)據(jù)提交
- HEAD:類似于get請求隙畜,只不過返回的響應(yīng)中沒有具體的內(nèi)容抖部,用于獲取報頭
- OPTIONS:允許客戶端查看服務(wù)器的性能∫槎瑁可以測試服務(wù)器功能是否正常
- PUT:一般用于修改
- DELETE:刪除
- TRACE:回顯服務(wù)器收到的請求,主要用于測試或診斷乡恕。
GET和POST區(qū)別:
- 在后退或刷新操作時言询,GET是無害的,而POST是會重新提交數(shù)據(jù)
- GET可以被收藏為書簽傲宜、POST不可以
- GET可以被瀏覽器緩存运杭,而POST不可以被瀏覽器緩存
- GET會保存在瀏覽器歷史記錄
- GET的長度限制(URL),最多有2048個字符函卒,而POST沒有限制
- GET只允許ASCII辆憔,而POST沒有限制
- GET的不安全,數(shù)據(jù)對所有人可見
延伸:HTTPS協(xié)議的工作原理
HTTPS是基于SSl/TLS的http協(xié)議报嵌,所有的HTTP數(shù)據(jù)都是在SSL/TLS協(xié)議之上傳輸?shù)摹?/p>
HTTPS協(xié)議在HTTP協(xié)議基礎(chǔ)上虱咧,添加了SSL/TLS握手以及數(shù)據(jù)加密傳輸,也屬于應(yīng)用層協(xié)議锚国。
延伸:常見網(wǎng)絡(luò)協(xié)含義及端口
FTP腕巡、Telnet、SMTP血筑、POP3绘沉、HTTP、DNS
- FTP: 文件傳輸協(xié)議豺总,默認(rèn)端口21
- Telnet:用于遠(yuǎn)程登錄的協(xié)議车伞,默認(rèn)端口23
- SMTP:簡單郵件傳輸協(xié)議,默認(rèn)端口25
- POP3:郵局協(xié)議版本3喻喳,接受郵件另玖,默認(rèn)端口110
- HTTP:超文本傳輸協(xié)議,默認(rèn)端口80
- DNS:域名解析服務(wù)沸枯,端口53
11. 開發(fā)環(huán)境及配置
版本控制軟件
集中式(CVS日矫、SVN)、分布式(Git)
PHP的運(yùn)行原理
Nginx+PHP-FPM
CGI:
FastCGI:CGI的改良版本
PHP-FPM:FastCGI的進(jìn)程管理器