1. 引用變量
<?php $a = range(0, 1000); var_dump(memory_get_usage()); // COW: Copy On Write 有修改操作才會進行copy // $b = $a; $b = &$a; var_dump(memory_get_usage()); $a = range(0, 1000); var_dump(memory_get_usage()); // zval變量容器 $c = range(0, 3); // 需安裝xdebug擴展 xdebug_debug_zval('c'); $d = $c; xdebug_debug_zval('c'); $c = range(0, 3); xdebug_debug_zval('c'); // unset 只會取消引用,不會銷毀空間 // 對象本身就是引用傳遞 class Person { public $name = "zhangsan"; } $p1 = new Person; xdebug_debug_zval('p1'); $p2 = $p1; xdebug_debug_zval('p1'); $p2->name = "lisi"; xdebug_debug_zval('p1');
概念:用不同的名字訪問同一個變量內容
定義方式:&
工作原理:
2. 常量及數據類型
字符串的定義方式:單引號,雙引號,heredoc和newdoc 區別:單引號不能解析變量,不能解析轉義字符,只能解析單引號和反斜線本身,效率比雙引號高;雙引號可以解析變量,變量可以使用特殊字符和{}包含,可以解析所有轉義字符;heredoc和newdoc分別類似於雙和單引號,都用來處理大文本
數據類型:標量,復合,特殊
1. 浮點類型不能運用到比較運算中;
2. boolean的false的七種情況;
3. 超全局數組:$GLOBALS,$_GET,$_POST,$_REQUEST,$_SESSION,$_COOKIE,$_SERVER,$_FILES,$_ENV
4. NULL的三種情況:直接賦值,未定義的變量,unset銷毀的變量
常量:const更快,是語言結構,可以定義類常量;define是函數,不能用於類常量的定義;常量一經定義,不能被修改和刪除 預定義常量:__FILE__,LINE DIR FUNCTION CLASS TRAIT METHOD NAMESPACE
3. 運算符
錯誤控制符@:放置在一個表達式之前,該表達式可能產生的任何錯誤信息都被忽略掉。
運算符優先級:++/-- > ! > 算術運算符 > 大小比較 > (不)相等比較 > 引用>^>|>邏輯與>邏輯或>三目>賦值>and > xor > or
比較運算符:==和===的區別;等值判斷(false的7種情況都是等值)
++/--:不影響boolean值;--NULL沒有效果,++NULL為1
邏輯運算符:短路作用;||和&&與or和and優先級不同
4. 流程控制
遍歷數組的3種方式及各自的區別:for循環只能遍歷索引數組;foreach可以遍歷索引和關聯數組,會reset();聯合使用list(),each()和while循環同樣可以遍歷索引和關聯數組,不會reset()操作(將數組指針回到開頭)。
分支:使用elseif時,總把優先范圍小的條件放在前面處理;switch后面的控制表達式的數據類型只能是整形,浮點或字符串;continue作用到switch的作用類似於break;跳出switch外的循環可以使用continue 2;switch...case...會生成跳轉表,直接跳轉到對應case
5. 自定義函數和內部函數
變量作用域:它定義的上下文背景(也是它的生效范圍),大部分變量只有一個單獨的范圍,跨度同樣包含了include和require引入的文件;global關鍵字的作用;$GLOBALS及其他超全局數組;
靜態變量:僅在局部函數域中存在,程序執行離開此作用域時其值不會消失;static:僅初始化一次,初始化時需要賦值,每次執行函數該值會保留,修飾的變量是局部的,僅在函數內部有效,可以記錄函數的調用次數,從而在某些條件下終止遞歸,初始static變量未賦值時值為NULL
函數的參數:默認情況下通過值傳遞;如果希望允許函數修改它的值,必須通過引用傳遞參數
函數的返回值:可返回包括數組和對象的任意類型;省略return,返回值為NULL,不可有多個返回值;從函數返回一個引用,必須在函數聲明和指派返回值給一個變量時都使用&
外部文件的導入:include/require包含並運行指定文件;如果給出路徑名按照路徑查找,否則從include_path中查找,再沒有則從調用腳本文件所在的目錄和當前工作目錄下尋找;當一個文件被包含時,其中所包含的代碼繼承了include所在行的變量范圍;加載過程中未找到文件則include會發出一條警告,后者會發出一個致命錯誤;include(require)/include_once(require_once)唯一區別是會檢查該文件是否已經被包含過,如果是則不會再次包含
系統內置函數:
時間日期:date() strtotime() mktime() time() microtime()
IP處理:ip2long() long2ip()
打印處理:print() printf() print_r() echo sprintf() var_dump() var_export()
序列化及反序列化函數:serialize() unserialize()
字符串處理:implode() explode() join() strrev() trim() strstr() number_format()
數組處理:array_keys() values() diff() intersect() merge() shift() unshift() pop() push() sort() rand()
6. 正則表達式
作用:分割,查找,匹配,替換字符串
分隔符:/,#,~
通用原子:\d \D \w \W \s \S
元字符:. * ^ $ + {n} {n,} {n,m} [] () [^] | [-]
模式修正符:i m e s U x A D u
后向引用:'/<b>(.*)<\/b>/' preg_replace($pattern, '\\1', $str)
貪婪模式:'/<b>.*?<\/b>/' 或者'/<b>.*<\/b>/U' preg_replace_all($pattern, '\\1', $str)
PCRE函數:preg_match() preg_match_all() preg_replace() preg_split()
中文匹配:UTF-8漢字編碼范圍是0x4e00-0x9fa5,在ANSI(gb2312)環境下0xb0-0xf7,0xa1-0xfe,utf-8要使用u模式修正符使模式字符串被當成utf-8,在ANSI(gb2312)環境下要使用chr將ascii碼轉換為字符
7. 文件及目錄處理
文件讀取/寫入操作:fopen() 打開模式:r/r++,w/w++,a/a++,x/x++,b,t
寫入函數:fwrite() fputs()
讀取函數:fread() fgets() fgetc()
關閉文件函數:fclose()
不需要fopen()打開的函數:file_get_contents() file_put_contents()
其它讀取函數:file() readfile()
訪問遠程文件:開啟allow_url_fopen(),HTTP協議連接只能使用只讀,FTP協議可以使用只讀或者只寫
目錄操作函數:
名稱相關:basename() dirname() pathinfo()
目錄讀取:opendir() readdir() closedir() rewinddir()
目錄刪除:rmdir()
目錄創建:mkdir()
文件大小:filesize()
目錄大小:disk_free_space() disk_total_space()
文件拷貝:copy()
刪除文件:unlink()
文件類型:filetype()
重命名文件或者目錄:rename()
文件截取:ftruncate()
文件屬性:file_exists() is_readable() is_writeable() is_executable() filectime() fileatime() filemtime()
文件鎖:flock()
文件指針:ftell() fseek() rewind()
8. 會話控制
通過GET參數傳遞,信息會暴露,參數可能丟失
cookie:有服務器發送給客戶端的片段信息
操作:setcookie() $_COOKIE
優缺點:不占用服務器資源,效率高些;不建議保存敏感信息,用戶有權禁用
session:基於cookie,利用cookie傳遞的sessionID信息在服務器中查找對應文件
操作:session_start() $_SESSION session_destory() session.auto_start .cookie_domain .cookie_lifetime .cookie_path .name .save_path .use_cookies .use_trans_sid .gc_probability .gc_devisor .gc_maxlifetime .save_handler
優缺點:信息安全,占用服務器資源
傳遞sessionID的問題:session_name() session_id() SID
session存儲:session_set_save_handler() mysql,memcache,redis等
9. 面向對象
類權限控制修飾符:public protected private
封裝:成員訪問權限
繼承:單一繼承;方法重寫 parent::
多態:抽象類的定義;接口的定義
魔術方法:__construct(),destruct,call,callStatic,get,set,isset,unset,sleep,wakeup,toString,clone
常見設計模式:工廠,單例,注冊樹,適配器,觀察者,策略
10. 網絡協議
HTTP協議狀態碼:五類響應 1XX:信息類,接收請求狀態處理 2XX:成功,請求正常處理完畢 3XX:重定向,需要附加操作以完成請求 4XX:客戶端錯誤,服務器無法處理請求 5XX:服務器錯誤狀態碼,服務器處理請求出錯 常見狀態碼:200 204 206 301 302 303 304 307 400 401 403 404 500 503
OSI7層模型:物理: 建立,維護,斷開物理連接 數據鏈路:建立邏輯鏈接,進行硬件地址尋址,差錯校驗等功能 網絡:進行邏輯地址尋址,實現不同網絡之間的路徑選擇 傳輸:定義傳輸數據的協議端口號,以及流控和差錯校驗 會話:建立管理終止會話 表示:數據表示安全壓縮 應用:網絡服務與最終用戶的一個接口
HTTP協議的工作特點和工作原理:基於B/S模式,通信開銷小,簡單快速,傳輸成本低,使用靈活,可使用超文本傳輸協議,節省傳輸時間,無狀態; 客戶端發送請求給服務器,創建一個TCP連接,指定端口號,默認80,連接到服務器,服務器監聽瀏覽器請求,一旦監聽到客戶端請求,分析請求類型后,服務器會向客戶端返回狀態信息和數據內容
HTTP協議常見請求/響應頭:Content-Type, Accept, Origin, Cookie, Cache-control, User-Agent, Referrer, X-Forwarder-For, Access-Control-Allow-Origin, Last-Modified
HTTP協議的請求方法:GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE
GET和POST的區別:GET在后退和刷新沒有變化,無害;POST會重新提交。GET可以收藏為書簽,POST不行。GET可以在瀏覽器緩存,POST不行。GET編碼類型Appication- ,POST還有multipart- ,文件上傳時需改為post。GET參數會保存在歷史記錄中,POST不會。GET向url添加數據長度受限,POST無限制。GET只允許ascii字符,POST無限制。GET安全性差。
HTTPS的工作原理:一種基於SSL/TLS的HTTP協議,所有的HTTP數據都是在SSL/TLS協議封裝之上傳輸的。在HTTP協議基礎上,添加了SSL/TLS握手以及數據加密傳輸,也屬於應用層協議。
常見網絡協議含義及端口:FTP21Telnet23 SMTP25 POP3110 HTTP80 DNS53
11. 開發環境及配置
版本控制軟件:集中式 CVS和SVN 和分布式Git 容災性,不用連接網絡?
PHP的運行原理:Nginx+PHP-FPM(FastCGI的進程管理器,master監聽端口和worker處理PHP代碼)
CGI:PHP解析器和webserver的連接 FastCGI:每次處理完請求后不會kill掉進程,使其一次處理多個請求,不用重新fork一個進程
PHP常見配置項:register_globals, allow_url_fopen, allow_url_include, date.timezone, display_errors, error_reporting, safe_mode, upload_max_filesize, max_file_uploads, post_max_size