1. PHP引用變量
什么是php引用變量,在PHP當(dāng)中幻枉,用什么符號(hào)定義引用變量势誊?
答:引用變量:在PHP中引用意味著用不同的名字訪問同一個(gè)變量?jī)?nèi)容撩笆。
定義方式:使用&符號(hào)延伸 php 引用原理
// COW Copy On Write (寫時(shí)復(fù)制)
//有一定經(jīng)驗(yàn)的程序員應(yīng)該都知道Copy On Write(寫時(shí)復(fù)制)使用了“[引用計(jì)數(shù)](https://baike.baidu.com/item/%E5%BC%95%E7%94%A8%E8%AE%A1%E6%95%B0)”(reference counting)苗傅,會(huì)有一個(gè)變量用于保存引用的數(shù)量抒线。當(dāng)?shù)谝粋€(gè)類構(gòu)造時(shí),string的[構(gòu)造函數(shù)](https://baike.baidu.com/item/%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0)會(huì)根據(jù)傳入的參數(shù)從堆上分配內(nèi)存渣慕,當(dāng)有其它類需要這塊內(nèi)存時(shí)嘶炭,這個(gè)計(jì)數(shù)為自動(dòng)累加,當(dāng)有類析構(gòu)時(shí)逊桦,這個(gè)計(jì)數(shù)會(huì)減一眨猎,直到最后一個(gè)類析構(gòu)時(shí),此時(shí)的引用計(jì)數(shù)為1或是0强经,此時(shí)睡陪,程序才會(huì)真正的Free這塊從堆上分配的內(nèi)存。
//memory_get_usage();獲取內(nèi)存使用量
$a=range(0,100);
var_dump(memory_get_usage());//376472 //一個(gè)內(nèi)存空間 refcount=1 is_ref=0
$b=$a;
var_dump(memory_get_usage());//376536 //一個(gè)內(nèi)存空間 refcount=2 is_ref=0
$a=range(0,100);
var_dump(memory_get_usage());//380872 兩個(gè)內(nèi)存空間 refcount=1 is_ref=0
$b=&$a;
var_dump(memory_get_usage());//376752 //一個(gè)內(nèi)存空間 refcount=1 is_ref=1
unset($a);//unset只會(huì)取消引用匿情,不會(huì)銷毀空間
var_dump(memory_get_usage());//376752
unset($b);
var_dump(memory_get_usage());//373552
class 特性
class Person{
public $name='張三';
}
$obj1=new Person();
var_dump($obj1);//張三
$obj2=$obj1;
var_dump($obj1);//張三
var_dump($obj2);//張三
$obj2->name='李四';
var_dump($obj1);//李四
var_dump($obj2);//李四
//結(jié)論:對(duì)象本身就是引用傳遞
真題
第一次循環(huán) abc
第二次循環(huán) bbc
第三次循環(huán) bcc
2. 常量及數(shù)據(jù)類型
PHP中字符串可以使用哪三種方式定義兰迫,他們的區(qū)別是什么?
- 三種方式 單引號(hào) 雙引號(hào) heredoc和newdoc
- 區(qū)別
1.單引號(hào)不能解析變量
2.單引號(hào)不能解析轉(zhuǎn)義字符码秉,只能解析單引號(hào)和反斜線本身
3.變量和變量逮矛、變量和字符串鸡号、字符串與字符串之間可以用.連接
4.雙引號(hào)可以解析變量转砖,變量可以使用特殊字符{}包含
5.雙引號(hào)可以解析所有轉(zhuǎn)義字符
6.也可以使用.連接
7.單引號(hào)效率更高
8.heredoc類似雙引號(hào)
9.newdoc類似單引號(hào)
10.heredoc和newdoc都用來處理大文本
* 延伸
1.數(shù)據(jù)類型
三大數(shù)據(jù)類型(標(biāo)量、復(fù)合、特殊)
1.1 浮點(diǎn)類型不能用于比較運(yùn)算中
1.2 flase的七中情況
0 0.0 ' ' '0' false array() null
1.3 PHP中超全局?jǐn)?shù)組
$GLOBALS;
$_SERVER;
$_FILES;
$_GET;
$_POST;
$_COOKIE;
$_ENV;
$_REQUEST;
$_SESSION;
重點(diǎn)記憶
$_SERVER['SERVER_ADDR'];//服務(wù)器端ip地址
$_SERVER['REMOTE_ADDR'];//客戶端ip地址
$_SERVER['SERVER__NAME'];//請(qǐng)求時(shí)間
$_SERVER['QUERY_STRING'];//?后面的
$_SERVER['HTTP_REFERER'];//上級(jí)請(qǐng)求頁面
$_SERVER['HTTP_USER_AGENT'];//頭信息中的user-agent信息
$_SERVER['REQUEST_URI'];//全
$_SERVER['PATH_INFO'];//路由
1.4 NULL的三種情況
直接賦值為NULL府蔗、未定義的變量晋控、unset銷毀的變量
1.5常量
1.5.1 定義方式
const define
1.5.2 區(qū)別
const更快,是語言結(jié)構(gòu)姓赤,define是函數(shù)
define不能用于類常量的定義赡译,const可以
常量一經(jīng)定義都不能被修改和被刪除
1.6 預(yù)定義常量
__FILE__;//文件路徑名和文件名稱
__LINE__;//所在行號(hào)
__DIR__;//所在目錄
__FUNCTION__;//所在函數(shù)體 函數(shù)名稱
__CLASS__;//類名
__TRAIT__;//trait名稱
__METHOD__;//方法名
__NAMESPACE__;//命名空間
3.PHP運(yùn)算符
真題
- foo()和@foo()之間的區(qū)別
php支持一個(gè)錯(cuò)誤運(yùn)算符:@ 當(dāng)將其放置在一個(gè)PHP表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯(cuò)誤信息都被忽略掉
-
運(yùn)算符優(yōu)先級(jí)
運(yùn)算符優(yōu)先級(jí) - ==和===的區(qū)別
===是全等于 數(shù)據(jù)類型也需要一致 -
遞增遞減運(yùn)算符
-
邏輯運(yùn)算符
短路作用和優(yōu)先級(jí)不同
image.png - 真題
$bool=false;
echo $bool++;
var_dump($bool++);//false;
$bool=true;
echo $bool++;//1
var_dump($bool++);//true;
4.流程控制
- 真題
PHP中如何優(yōu)化多個(gè)if...eleif 語句不铆?
將可能性大的放前面
考慮使用switch..case
7 會(huì)話控制
會(huì)話控制
為什么要使用會(huì)話控制技術(shù)
http是無狀態(tài)的 無法記錄用戶的狀態(tài)
會(huì)話控制技術(shù) 用來跟蹤用戶的請(qǐng)求
請(qǐng)求一次后蝌焚,保存狀態(tài) 下一次再請(qǐng)求時(shí) 就有記錄了
實(shí)現(xiàn)方式
GET值傳遞
cookie
設(shè)置cookie
setcookie(value,
path,
secure)
value 值
path 路徑
secure 安全相關(guān)
獲取cookie
$_COOKIE[key]
刪除cookie
setcookie($name,'',time()-1);
cookie優(yōu)缺點(diǎn)
1.不會(huì)占用服務(wù)器資源
2.存在客戶端不安全
3.用戶可以禁用cookie
session優(yōu)缺點(diǎn)
1.session基于cookie 如果cookie被禁用 可以通過值傳遞的方式傳輸
2.存儲(chǔ)在服務(wù)器
HTTP 狀態(tài)碼
1xx 信息類狀態(tài)碼 表示接收的請(qǐng)求正在處理
2xx 請(qǐng)求處理狀態(tài)
200 成功
204 不含實(shí)體的主體部分
206 部分的內(nèi)容
3xx 重定向
301 永久重定向
302 臨時(shí)重定向
303
304
307
4xx 客戶端錯(cuò)誤
400
401
403
404
5xx 服務(wù)端錯(cuò)誤
500
503
OSI 七層模層
第一層 物理層 建立維護(hù)斷開物理連接
第二層 數(shù)據(jù)鏈路層 建立邏輯連接、進(jìn)行硬件地址尋址誓斥、差錯(cuò)校驗(yàn)等功能
第三層 網(wǎng)絡(luò)層 進(jìn)行邏輯地址尋址只洒,實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇
第四層 傳輸層 定義傳輸數(shù)據(jù)的協(xié)議端口號(hào),以及流控和差錯(cuò)校驗(yàn) TCP劳坑、UDP 數(shù)據(jù)包一旦離開網(wǎng)卡即 進(jìn)入網(wǎng)絡(luò)傳輸層
第五層 會(huì)話層 建立管理終止會(huì)話
第六層 表示層 數(shù)據(jù)的表示安全和壓縮
第七層 應(yīng)用層 網(wǎng)絡(luò)服務(wù)與應(yīng)用服務(wù)的一個(gè)接口 協(xié)議有 HTTP FTP TFTP SMTP SNMP DNS ETELNET HTTPS POP3 DHCP
8.正則表達(dá)式
正則表達(dá)式的作用
分隔符正斜線(/)毕谴、hash符號(hào)(#)、取反符號(hào)(~)
-
通用原子
- \d 匹配數(shù)字
- \D 匹配除了數(shù)字
- \w 數(shù)字字母下劃線
- \W 除了數(shù)字字母下劃線
- \s 空白符
- \S 除了空白符
-
元字符
- . 除了換行符
前面的內(nèi)容0個(gè)一個(gè)或多個(gè)
- ? 前面的內(nèi)容0個(gè)或一個(gè)
前面的內(nèi)容0個(gè)或一個(gè)
- ^ 以^后面的內(nèi)容開始
-
后面的前面的內(nèi)容結(jié)束
- {n} 匹配前面的內(nèi)容n個(gè)
- {n,} 匹配前面的內(nèi)容>=n個(gè)
- {n,m} 匹配前面的內(nèi)容>=n個(gè)<=m個(gè)
- [] 集合 [abc] a或b或c
- () 后向引用或整體
- [^] 取反 [^abc] 除了abc
- | 或者
- [-] 范圍 [0-9] 代表0-9
-
模式修正符
- i 不區(qū)分大小寫
- m 每一行分開匹配(前提是有換行)
- e 對(duì)匹配到的數(shù)據(jù)做php語法處理(php7.0已移除)
- s 修正點(diǎn).的換行
- U 取消貪婪模式
- x 忽略模式中的空白符
- A 必須以這個(gè)模式開頭
- D 修正$對(duì)\n的忽略
- u 中文匹配
-
后向引用
eg:
$str='<b>abc</b>';
$pattern='/<b>(.*)<\/b>/';
preg_replace($pattern,'\\1 ',$str);//此處1代表(.*)匹配到的東西
- 貪婪模式
eg:
$str='<b>abc</b><b>abc</b>';
$pattern='/<b>(.*)<\/b>/';
preg_replace($pattern,'\\1 ',$str);
.* 匹配會(huì)匹配到最后一個(gè) //<b>abc</b><b>abc</b>
.*距芬?取消貪婪模式匹配到一個(gè) 就不往下匹配了 //<b>abc</b>