算是一個入門, 對網上shocker基礎上整理javascript
- ####php學習
- #####基礎
- ```
- 1. <?php ... ?>全部代碼都在這裏面,分號表示一句
- 2. 註釋三種//, /*...*/ #
- 3. 函數,類,關鍵字大小寫不敏感, 即echo和EcHo是同樣的
- 4.變量以 $ 符號開頭,其後是變量的名稱; 變量名稱必須以字母或下劃線開頭; 變量名稱不能以數字開頭; 變量名稱只能包含字母數字字符和下劃線(A-z、0-9 以及 _);變量名稱對大小寫敏感($y 與 $Y 是兩個不一樣的變量
- 這裏的變量和shell中的變量不一樣,不用建立,用的時候就有
- 5.變量也分local和globle,函數外爲globle,內部則爲local;函數內部若是有globle則表示的是一個全局
- 6.static和c中的static同樣
- 7.echo和print 前者快, 後者不論如何返回1,前者不返回,print可格式化輸出
- 8.整數和浮點數,var_dump()會返回類型和值
- 9.字符串函數,不少,基本經常使用的函數都具有,使用時查詢手冊
- strlen()
- strpos("hello world","world")返回6
- 10.define()相似#define可設置一個常量
- 11.字符串接符
- $tx1=hello. $tx2=$tx1."world",則$tx2就是"helloworld",也但是.=
- 12.--,++也適用
- 13.<>不等於===全等(值和類型)!==不全等(值和類型都不一樣),>=,<=這個也能夠表示關係型
- 14.邏輯運算or,and,xor,&&,||,!
- 15.數組操做
- +,==,===,!=,<>,!==
- 16.php有1000多個內建函數.
-
-
- //語法錯誤(syntax error)在語法分析階段,源代碼並未被執行,故不會有任何輸出。
-
-
- /* 【命名規則】 */
- 常量名 類常量建議全大寫,單詞間用下劃線分隔 // MIN_WIDTH
- 變量名建議用下劃線方式分隔 // $var_name
- 函數名建議用駝峯命名法 // varName
- 定界符建議全大寫 // <<<DING, <<<'DING'
- 文件名建議全小寫和下劃線、數字 // func_name.php
- 私有屬性名、方法名建議加下劃線 // private $_name _func
- 接口名建議加I_ // interface I_Name
-
- /* 語言結構 */
- array(), echo(), empty(), eval(), exit(), isset(), list(), print(), unset()
- echo, print 可省略括號。
-
- /* 預約義常量 */
- PATH_SEPARATOR //路徑分隔符(Windows爲分號,類Unix爲冒號)
- DIRECTORY_SEPARATOR //目錄分隔符
- PHP_EOL //當前系統的換行符
- PHP_VERSION //PHP版本號
- PHP_OS //PHP服務操做系統
- PHP_SAPI //用來判斷是使用命令行仍是瀏覽器執行的,若是 PHP_SAPI=='cli' 表示是在命令行下執行
- PHP_INT_MAX INT最大值,32位平臺時值爲2147483647
- PHP_INT_SIZE INT字長,32位平臺時值爲4(4字節)
- M_PI //圓周率值
- M_E //天然數
-
- //PHP運行環境檢測函數
- php_sapi_name() //返回一個PHP與WEB服務器接口類型的小寫字符串
- 該函數返回值與常量PHP_SAPI一致!
- 接口類型:SAPI(the Server API, SAPI)
- 可能值:aolserver、apache、apache2filter、apache2handler、caudium、cgi、cgi-fcgi、cli、 continuity、embed、isapi、litespeed milter、nsapi、phttpd、pi3web、roxen、thttpd、tux、webjames
-
-
- /* 大小寫問題 */
- - 類名、方法名、屬性名、函數名:不區分大小寫
- - 變量名、常量名、元素下標:區分大小寫
-
- /* 可變標識符 */
- 可變變量 $i = 3; $k = 'i'; echo $$k; //輸出3
- 可變函數 function func() {echo 'hello!';} $i = 'func'; $i(); //輸出hello
- 可變下標 $i = '1234'; $k = 3; echo $i[$k]; //輸出4
- 可變類名 class CLS{public $k = 'hello';} $i = 'CLS'; $j = new $i; echo $j->k;
- 可變屬性 class CLS{public $k = 'hello';} $i = 'k'; $j = new CLS; echo $j->$i;
- 可變方法 class CLS{public function k(){echo 'hello';}} $i='k'; $j=new CLS; $j->$i();
-
- /* 可變變量 */
- * 用於業務邏輯判斷獲得某些具體信息
- $var_name = "class_name";
- $$var_name = "PHP0913"; // $class_name = "PHP0913";$class_name已存入內存中
- var_dump($class_name); // var_dump($$var_name);
-
- /* 變量函數 */
- get_defined_vars //返回由全部已定義變量所組成的數組(包括環境變量、服務器變量和用戶定義的變量)
-
-
- /* unset() */
- * unset()僅刪除當前變量名和引用,其值並未被刪除
- * 引用傳遞中,刪除一個變量及其引用,其餘變量及引用均存在,且值依然存在
-
- echo "<br />";
- $v3 = '值';
- $v4 = &$v3;
- unset($v4);
- var_dump($v3, $v4);
-
- /* 變量的最長有效期 */
- * 當前腳本的執行週期,腳本執行結束,變量即消失
-
-
- /* 預約義變量/超全局變量 */
- $GLOBALS
- $_COOKIE
- $_ENV
- $_FILES
- $_GET
- $_POST
- $_REQUEST
- $_SERVER
- $_SESSION
-
-
- /* 常量定義 */
- define(常量名, 常量值, [區分大小寫參數]) //true表示不區分/false表示區分大小寫
- const 常量名 = 常量值 // 新,建議
- 常量名可使用特殊字符
- constant($name) // 獲取常量名
- // 例:echo constant('-_-');
-
-
- /* 常量相關函數 */
- defined
- get_defined_constants
-
-
- /* 預約義常量 */
- __FILE__ 所在文件的絕對路徑
- __LINE__ 文件中的當前行號
- __DIR__ 文件所在目錄
- __FUNCTION__ 函數名稱
- __CLASS__ 類的名稱
- __METHOD__ 類的方法名
- __NAMESPACE__ 當前命名空間的名稱
-
-
- /* 整型 */
- 整型佔用4字節,共4*8=32位,最大值爲2147483647,最小值爲-2147483648,最小值的絕對值比最大值的大1
- 最高爲表示正負,1表示負,0表示正
-
-
- /* 進制轉換函數 */
- 只能十進制與其餘進制進行轉換,只有六種
- 轉換時,參數應是字符串(即不可含八進制的「0」或十六進制的「0x」)
- dec
- bin
- oct
- hex
- hexdec() 十六進制轉十進制 也可寫hex2dec()
- dechex() 十進制轉十六進制 也可寫dec2hex()
- bindec() 二進制轉十進制 也可寫bin2dec()
- decbin() 十進制轉二進制 也可寫dex2bin()
- octdec() 八進制轉十進制 也可寫oct2dec()
- decoct() 十進制轉八進制 也可寫dec2oct()
-
-
- /* 浮點數 */
- 浮點數不能比較大小 !!!
- 幾乎全部小數,在保存時都是近似值而不是精確值!
- 最大值:+/- 1.8E308
- PHP所能保存的最長小數位:14位
-
- /* 單引號字符串 */
- 單引號字符串中,只能轉義反斜槓和單引號
-
- /* 雙引號字符串 */
- 只解析字符串一次 !!!
- eval 把字符串做爲PHP代碼執行
- 大括號包裹變量,可肯定變量名界限。如:"aaa{$bbb}ccc"
- 雙引號中能夠將ASCII碼轉換爲字符
- "\x61" -> a // 字符串中不需0,整型中才是0x前導
- "\x49\x54\x43\x41\x53\x54" -> ITCAST
- 將ASCII轉成字符函數chr()
- 將字符轉成ASCII函數ord()
- #雙引號轉義列表
- \n 換行
- \r 回車
- \t 水平製表符
- \\ 反斜線
- \$ 美圓標記
- \v 垂直製表符
- \e Escape
- \f 換頁
- \" 雙引號"
- \[0-7]{1,3} 符合該正則表達式序列的是一個以八進制方式來表達的字符
- \x[0-9A-Fa-f]{1,2} 符合該正則表達式序列的是一個以十六進制方式來表達的字符
-
-
-
- /* 定界符 */
- herodoc - 功能同雙引號,能解析
- $str = <<<AAA
- 字符串內容
- AAA;
-
- nowdoc - 功能同單引號,不能解析
- 只在開始位置有單引號
- $str = <<<'AAA'
- 字符串內容
- AAA;
-
-
- /* 字符串的使用 */
- 可將字符串看成一個字符的集合來使用,可獨立訪問每一個字符。僅適用於單字節字符(字母、數字、半角標點符號),像中文等不可用
- $str = "abcd";
- echo $str[3]; // d
- echo $str{0}; // a
-
-
- /* 【類型操做函數】 */
- //獲取/設置類型
- gettype($var) //獲取變量的數據類型
- settype($var, $type) //設置變量的數據類型
-
- //類型判斷
- is_int
- is_float
- is_null
- is_string
- is_resource
- is_array
- is_bool
- is_object
- is_numeric 檢測變量是否爲數字或數字字符串
-
- //轉換成指定的數據類型
- boolval
- floatval
- intval
- strval
-
- //強制轉換類型
- (int)
- (float)
- (string)
- (bool)
- (array)
- (object)
- (unset) //轉換爲NULL
- (binary) 轉換和 b前綴轉換 //轉換成二進制
-
- var_dump 打印變量的相關信息。
- 顯示關於一個或多個表達式的結構信息,包括表達式的類型與值。
- 數組將遞歸展開值,經過縮進顯示其結構。
- var_export($var [,bool $return]) //輸出或返回一個變量的字符串表示
- $return:爲true,則返回變量執行後的結果
- print_r 打印關於變量的易於理解的信息
- empty 檢查一個變量是否爲空
- isset 檢測變量是否存在
-
- /* 【流程控制】 */
- //if語句的替代語法
- if (條件判斷) :
- 語句塊;
- elseif (條件判斷) :
- 語句塊;
- else :
- 語句塊;
- endif;
-
- //流程控制的替代語法
- 在嵌入HTML時經常使用
- 將 { 換成 : , 將 } 換成 endif; 等
- endif
- endwhile
- endfor
- endforeach
- endswitch
-
-
- /* 【switch】 */
- switch (條件) {
- case 狀態值1:
- 語句塊;
- [break;]
- case 狀態值2:
- 語句塊;
- [break;]
- case 狀態值3:
- case 狀態值4:
- 語句塊;
- [break;]
- default:
- 語句塊;
- [break;]
- }
- switch是狀態分支,特殊的循環
- 先計算出狀態值,再去與判斷數做比較
- break退出流程
-
-
- /* 【for循環】 */
- for (條件初始化表達式; 條件判斷表達式; 條件變化表達式) {
- 循環體
- }
-
- 假設循環體被執行了N次,則
- 條件初始化表達式被執行1次
- 條件判斷表達式被執行N+1次
- 條件變化表達式被執行N次
-
- 注意:
- 1. 循環變量在for語句結束後還能夠繼續使用,值爲第一次失敗的值
- 2. 循環變量在for循環體內可使用
- 3. 任何條件表達式都可省略,但分號不能省略
- a. 條件初始化表達式被省略時,循環變量被賦值爲null,在與條件判斷時,
- 進行類型轉換後再比較。也能夠在for語句外進行初始化。
- b. 條件判斷表達式被省略時,表示循環爲真,進入死循環
- c. 條件變化表達式被省略時,能夠在循環體內完成
- 4. 每一個表達式都可由多條語句組成,每條語句之間使用逗號分割
- 若是條件判斷表達式由多條語句組成,都會執行,但只有最後一條語句才做爲判斷條件
- 5. for只能遍歷數值型索引下標數組
- 數組長度函數:count()
- 6. 應該將能夠初始化的語句均放在條件初始化表達式內,這樣能夠省去不少執行次數
-
-
- /* 【goto】5.3+ 版本 */
- 用來跳轉到程序中的某一指定位置
- 該目標位置能夠用目標名稱 加上冒號來標記。
- PHP中的goto有必定限制,只能在同一個文件和做用域中跳轉,
- 也就是說你沒法跳出一個函數或類方法,也沒法跳入到另外一個函數。
- 你也沒法跳入到任何循環或者switch結構中。
- 常見的用法是用來跳出循環或者switch,能夠代替多層的break。
- 能夠從循環(switch)中跳出來,但不能從外部跳轉進去。而函數或類方法,向外向內均不可。
- goto a;
- echo 'Foo';
- a:
- echo 'Bar';
-
-
- /* 【文件加載】 */
- require / include / require_once / include_once
- 文件載入只是載入目標文件內的代碼並執行,與載入的文件類型無關
-
- 文件載入屬於執行階段,當執行到require等語句時,才載入該文件的代碼,
- 編譯並執行,而後回到require等語句位置繼續執行下面的語句
- 【注意】
- 在載入開始時,先退出PHP模式;
- 再載入目標文件代碼,執行該代碼;
- 結束時,再進入PHP模式。
- require:處理失敗,產生 E_COMPILE_ERROR 錯誤,腳本停止。
- include:處理失敗,產生 E_WARNING 錯誤,腳本繼續執行。
-
- #不建議使用require_once/include_once
-
-
- /* 【相對路徑】 */
- 當前瀏覽器請求的哪一個腳本,當前位置就是屬於哪一個腳本。
- ./file 和 file 都表示當前目錄下的file文件
- file狀況(嵌套載入文件時):
- 若是當前目錄沒找到該文件就在代碼文件所在目錄中繼續找。
- 若是當前目錄找到有該文件,則不會再在代碼文件所在目錄去找也不會再加載。
- __DIR__ 腳本文件所在目錄
- __FILE__ 腳本文件路徑
-
- include_path 加載文件查找目錄
- set_include_path() 設置include_path,可多個,用字符串做參數
- 該函數設置的path只針對該當前文件有效
- 該設置只針對查找未直接寫文件路徑方式有效
- 設置新的include_path會覆蓋原來的
-
- get_include_path() 獲取當前include_path設置項,無參數
-
- 路徑分隔符,在Windows下是分號,在Linux下是冒號
- 利用預約義常量 PATH_SEPARATOR 來得到當前的分隔符
-
- 若是直接寫文件名:
- 1. include_path所設置的
- 2. 當前目錄
- 3. 代碼所在文件的目錄
- 若是文件名前帶有路徑,則會直接根據路徑查找,include_path直接被忽略
-
-
- /* 【return】 */
- return與require結合,可返回文件的內容,return寫在被載入的文件內
- return能夠終止所在腳本的執行,做爲普通腳本語句
- return能夠返回函數的相應值
-
-
- /* 【終止和延遲腳本執行】 */
- die / exit 終止
- return是終止所在腳本的執行
- die和exit會當即終止腳本執行
- die("到此爲止"); 該函數內的字符串可被輸出
- sleep() 延遲(單位:秒)
- 默認最多可延遲30秒,PHP配置能夠修改 max_execution_time
- 例:sleep(12);
- usleep() 以指定的微秒數延遲執行
- time_sleep_until 使腳本睡眠到指定的時間爲止
-
-
- /* 【函數】 */
- 1. 函數的聲明是在編譯時,故先定義再調用,定義與調用無前後關係!
- 2. 文件只是代碼的載體,程序均在內存中執行!
- 3. 若是函數的定義在須要載入的文件內,則須要先載入該文件,不然調用出錯!
- 4. 函數的定義能夠出如今其餘的代碼段中,此時函數不會在編譯階段被執行
- 只有被執行到時纔會被定義!只有獨立定義時纔會被編譯在內存中!
- 若是出如今其餘函數體內,也須要外層函數被調用時才被定義並生效!
- 5. 函數名不區分大小寫
- 6. 不容許重名,包括系統函數
- 7. 【可變函數】
- 函數名能夠用其餘變量代替
- $func_name = "sayHello";
- $func_name(); //此時調用sayHello()函數
- 注意:只有在調用時才能使用變量,定義時不容許!
- 8. 變量可做爲函數名調用函數,數組元素值也能夠!
- 9. 形式參數parameter,實際參數argument
- 能夠對參數傳遞 null,表示該形參不想傳遞值
- 形參與實參之間既可值傳遞,也可引用傳遞。
- 引用傳遞參數,應該在定義函數時就在形式參數前加上 & 符號,而此時調用函數實參必須爲變量
- 如何選擇使用哪一種傳遞方式?
- a. 是否須要保證原始數據的完整性
- b. 是否須要增長效率
- c. 對大數據引用傳遞可節省內存
- 10. 參數默認值
- a. 函數的參數默認值必須是已經肯定的值,不能是變量!
- 只要在調用以前定義該常量,則可使用常量做爲參數默認值
- b. 函數默認值能夠有多個,建議將有默認值的參數放在參數列表的最後面
- 這樣能夠在調用函數時,不賦予後面有默認值的參數值,不然會出錯
- c. 默認參數能夠是非標量類型,好比數組、null
- d. 任何默認參數必須放在任何非默認參數的右側
- 11. 參數數量
- a. 形參數量多於實參數量
- 報告警告級別錯誤,並以NULL代替
- b. 實參多於形參
- 不報告錯誤,依次爲形參賦值
- c. 不肯定參數數量
- 1) 一個形參都不定義,永遠都是實參多於形參
- 2) 【可變數量參數】
- func_get_args() 獲取當前函數被調用時全部實參的值,返回一個全部實參值組成的數組
- func_get_arg() 獲取某個實參的值,經過索引值標識,e.g: func_get_arg(0)
- func_num_args() 獲取全部實參的數量
- 12. 【return】返回值
- a. 函數只有一個返回值,能夠經過返回一個數組來獲得相似的結果,但能夠有多條return語句
- b. return語句會當即停止函數的運行,並將控制權交回調用該函數的代碼行
- c. 能夠返回包括數組和對象的任意類型
- d. 函數的返回也分值傳遞和引用傳遞(返回的是一個變量纔可)
- 1) 默認是值傳遞方式
- 2) 引用傳遞方式:
- - 定義函數時,函數名前加上& 表示該函數能夠返回引用
- - 調用函數時,函數名前加上& 表示取得函數返回的引用
- 此時,函數外修改返回值,會修改函數內的該返回變量的值
- - 若是函數需返回引用,則須要返回一個變量才能夠
- - 從函數返回一個引用,必須在函數聲明和指派返回值給一個變量時都使用引用操做符&
- function &returns_reference(){return $someref;}
- $newref =& returns_reference();
- 3) 返回引用的做用
-
-
- /* 【變量做用域】 */
- a. 全局變量和局部變量
- 1) 做用域之間不重疊,即不一樣做用域的變量,之間不可訪問
- 2) 全局做用域 - 函數以外的區域
- 3) 局部做用域 - 函數內的區域,每一個函數都是一個獨立的做用域
-
- b. 超全局變量,既能夠在全局也可在局部使用,僅能用系統自帶的,均是數組變量。
- $GLOBALS $_COOKIE $_ENV $_FILES $_GET
- $_POST $_REQUEST $_SERVER $_SESSION
- c. $GLOBALS
- 1) 不能存在超全局變量,但能夠有超全局的數據!
- 2) 將須要的數據放到超全局變量的數組內,但統一使用$GLOBALS
- 3) $GLOBALS 特徵
- - 每一個全局變量就是對應$GLOBALS內的一個元素!
- 每當增長一個全局,則自動在$GLOBALS內增長一個同名元素!
- 同理,每當增長元素,也會增長一個全局變量,通常在函數內增長
- - 作的任何修改,也會映射到另外一個,包括更新和刪除
- 在函數內訪問全局變量,只需使用$GLOBALS
- - 出現過的全局變量,就能夠經過$GLOBALS這個數組取得
- 4) PHP生命週期中,定義在函數體外部的所謂全局變量,函數內部是不能直接得到的
- 4) global關鍵字(不建議使用)
- 將局部變量聲明爲同名全局變量的一個'引用'!至關於常量的引用傳遞
- global $var; // $var = &$GLOBALS['var'];
- 不一樣於$GLOBALS!!!
- global在函數產生一個指向函數外部變量的別名變量,而不是真正的函數外部變量。
- $GLOBALS確確實實調用是外部的變量,函數內外會始終保持一致。
- global的做用是定義全局變量,可是這個全局變量不是應用於整個網站,而是應用於當前頁面,包括include或require的全部文件。
- d.
- 1) 做用域只針對變量,對常量無效
- 2) 被載入文件中定義的變量做用域取決於被載入的位置。
- 函數外被載入就是全局,函數內被載入就是局部!
-
-
- /* 【變量生命週期】 */
- 1. 腳本結束時,全局變量消失
- 2. 函數執行完時,局部變量消失
- 3. 靜態變量
- static關鍵字
- 靜態變量僅在局部函數域中存在,但當程序執行離開此做用域時,其值並不丟失。
- 靜態變量僅會被初始化一次,其餘局部變量每次被調用時都會被從新賦值。
- static聲明的靜態變量的生命週期會被一直延續。
-
-
- /* 【迭代和遞歸】 */
- 迭代比遞歸效率高!
- 迭代是一種思想(算法),結構和使用上如同循環!
- 遞歸是一種思想(算法),將大問題拆分紅小問題,逐一解決小問題以解決大問題
- 要求大問題和小問題的解決方案是一致的!
- 遞歸的結構和語法體現如圖函數。函數體內調用函數自己!
- 遞歸出口:當該問題能夠解決時,則不用再遞歸
-
-
- /* 【匿名函數/閉包函數】 */
- 匿名函數,也叫閉包函數(closures),容許臨時建立一個沒有指定名稱的函數。
-
- 1. 定義匿名函數時,不需增長函數名。
- 2. PHP對匿名函數的管理,以一個對象的方式進行處理。
- 3. 匿名函數應該存放到變量內。
- 4. 匿名函數經過Closure類來實現
- 5. 可使用函數做爲函數的參數和返回值
- 6. 聲明函數時可使用 use($param) 來向函數中傳入函數外的變量,結合變量引用來實現閉包
- 7. 能夠用變量引用函數
- $func = function ($e) {
- echo $e;
- }; //結束時,需分號結束,如同變量賦值
- var_dump($func); //使用匿名函數
- $func('ITCAST'); //函數的調用
- 這不是可變函數,而是對象。Closure閉包類
- //use語法
- 匿名函數傾向於值的概念,可能出如今任何地方。
- use可使得匿名函數使用其外部做用域的變量。非全局!
- use與全局的區別:
- use使用其外部做用域的變量
- function out() {
- $v = "in out";
- $func = function () use (& $v) {
- var_dump($v);
- }
- }
- use相似參數的自動傳遞,也支持值與引用的傳遞方式。
- //做用
- 常做爲'臨時函數'被調用(只在某個地方被調用的函數)
- 例如:
- PHP存在一個array_map()函數,功能是針對一個函數內每一個元素,去調用某個函數
- 操做結果(array) = array_map(操做函數, 操做數組);
- $result_arr = array_map(function ($v) {return $v3}, $arr);
-
- //閉包用法實例
- function closureCreater() {
- $x = 1;
- return function($fun = null) use(&$x) {//按引用傳值
- echo "<br />" . $x++;
- $fun and $fun();
- };
- }
-
- $x = "hello world";
- $test = closureCreater();
- $test();
- $test(function(){ echo "closure test one"; });
- $test(function(){ echo "closure test two"; });
- $test(function() use($x){ echo "<br />".$x;});
-
- //將函數保存爲數組元素
- $x = 'outer param.';
- $arr = array();
- $arr[] = function($str)use($x){ return $str.$x; };
- echo $arr[0]('test fun in arr,');
-
-
- /* 【數組】 */
- 關聯數組:鍵和值有關聯,鍵表示值的邏輯含義。
- 索引數組:鍵和值無關聯,鍵表示值的位置。一般下標從0開始,遞增元素
- count($var [,$mode]) //統計數組元素個數
- $mode可選,設爲1或true時則遞歸統計
- $var非數組,返回1;$var未初始化或等於null或空數組,返回0
-
- //鍵名的使用
- 整型數字鍵不需加引號($arr[1])
- 字符串數字鍵也不需加引號($arr = array('1'=>'abc'); $arr[1])
- 關聯數組,字符串鍵需加引號($arr = array('a'=>'aaa'); $arr['a'])
- 關聯數組,雙引號中解析變量,可不加引號($arr = array('a'=>'aaa'); "$arr[a]")
-
- /* 【指針】 */
- current/pos 返回當前被內部指針指向的數組單元的值,並不移動指針。
- key 返回數組中當前單元的鍵名,並不移動指針
- next 將數組中的內部指針向前移動一位,並返回移動後當前單元的值。先移動,再取值。
- prev 將數組的內部指針倒回一位,並返回移動後當前單元的值先移動,再取值。
- end 將數組的內部指針指向最後一個單元,並返回最後一個單元的值
- reset 將數組的內部指針指向第一個單元,並返回第一個數組單元的值
-
- each 返回數組中當前的鍵/值對並將數組指針向前移動一步。
- 返回的是一個由鍵和值組成的長度爲4的數組,下標0和key表示鍵,下標1和value表示值
- 在執行each()以後,數組指針將停留在數組中的下一個單元
- 或者當碰到數組結尾時停留在最後一個單元。
- 若是要再用 each 遍歷數組,必須使用 reset()。
-
- 1. 以上指針操做函數,除了key(),若指針移出數組,則返回false。而key()移出則返回null。
- 2. 若指針非法,不能進行next/prev操做,能進行reset/end操做
- 3. current/next/prev 若遇到包含空單元(0或"")也會返回false。而each不會!
-
- list 把數組中的值賦給一些變量。list()是語言結構,不是函數
- 僅能用於數字索引的數組並假定數字索引從0開始
- /* 可用於交換多個變量的值 */ list($a, $b) = array($b, $a);
- 例:list($drink, , $power) = array('coffee', 'brown', 'caffeine');
-
- 1. 複製數組,其指針位置也會被複制。
- 特例:若是數組指針非法,則拷貝的數組指針會重置,而原數組的指針不變。
- 【指針問題】
- 誰第一個進行寫操做,就會開闢一個新的值空間。與變量(數組變量)值傳遞給誰無關。
- 數組函數current()被定義爲寫操做,故會出現問題。
- foreach遍歷的是數組的拷貝,當被寫時,纔會開闢一個新的值空間。
- 即,foreach循環體對原數組進行寫操做時,纔會出現指針問題。
- 若是開闢新空間時指針非法,則會初始化指針。
- 2. 若是指針位置出現問題,則reset()初始化一下就可解決。
-
-
- /* 【遍歷數組】 */
- * 先找到元素,再獲取鍵和值
-
- foreach
- foreach (array_expression as [$key =>] & $value)
- 當foreach開始執行時,數組內部的指針會自動指向第一個單元。
- 獲取元素信息後,移動指針,再執行循環體
- 1. foreach自己循環結構,break和continue適用於foreach
- 2. foreach支持循環的替代語法。
- 3. $value是保存元素值的變量,對其修改不會改變數組的元素值
- 4. $value支持元素值的引用拷貝,在$value前加上&便可
- 5. $key不支持引用傳遞
- 6. foreach遍歷的是原數組的拷貝,而在循環體對數組的操做是操做原數組
- 即循環體對數組的操做,對原數組生效,對遍歷不生效。
- 先拷貝一份數組用做遍歷
-
- while...list...each
- while (list($key, $val) = mysql_fetch_row($result)) = each($arr) {
- echo "$key => $val\n";
- }
-
-
-
- /* 【數組函數】 */
- //統計計算
- count 計算數組中的單元數目或對象中的屬性個數
- array_count_values 統計數組中全部的值出現的次數
- array_product 計算數組中全部值的乘積
- array_sum 計算數組中全部值的和
- range 創建一個包含指定範圍單元的數組
-
- //獲取數組內容
- array_chunk 將一個數組分割成多個
- array array_chunk(array $input, int $size[, bool $preserve_keys])
- array_filter 用回調函數過濾數組中的單元
- array_slice 從數組中取出一段
- array array_slice($arr, $offset [,$len [,$preserve_keys]])
- array_keys 返回數組中全部的鍵名
- array array_keys(array $input[, mixed $search_value[, bool $strict]] )
- 若是指定了可選參數 search_value,則只返回該值的鍵名。不然input數組中的全部鍵名都會被返回。
- array_values 返回數組中全部的值,並創建數字索引
-
- array_merge 合併一個或多個數組
- 一個數組中的值附加在前一個數組的後面。
- 若是輸入的數組中有相同的字符串鍵名,則該鍵名後面的值將覆蓋前一個值。
- 若是數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。
- 若是隻給了一個數組而且該數組是數字索引的,則鍵名會以連續方式從新索引。
- array_merge_recursive 遞歸地合併一個或多個數組
-
- //搜索
- in_array 檢查數組中是否存在某個值
- bool in_array(mixed $needle, array $haystack[, bool $strict])
- array_key_exists 檢查給定的鍵名或索引是否存在於數組中
- isset()對於數組中爲NULL的值不會返回TRUE,而 array_key_exists()會
- array_search 在數組中搜索給定的值,若是成功則返回相應的鍵名
-
- array_combine 建立一個數組,用一個數組的值做爲其鍵名,另外一個數組的值做爲其值
- 若是兩個數組的單元數不一樣或者數組爲空時返回FALSE。
- array_rand 從數組中隨機取出一個或多個單元,返回鍵名或鍵名組成的數組,下標是天然排序的
- array_fill 用給定的值填充數組
- array_fill($start, $num, $value)
- array_flip 交換數組中的鍵和值
- array_pad 用值將數組填補到指定長度
- array_reverse 返回一個單元順序相反的數組
- array_unique 移除數組中重複的值
- array_splice 把數組中的一部分去掉並用其它值取代
-
- implode 將數組元素值用某個字符串鏈接成字符串
- explode($delimiter, $str [,$limit]) //使用一個字符串分割另外一個字符串
- $delimiter不能爲空字符串""
-
- array_map 將回調函數做用到給定數組的單元上,只能處理元素值,能夠處理多個數組
- 若是callback參數設爲null,則合併多個數組爲一個多維數組
- array_walk 對數組中的每一個成員應用用戶函數,只能處理一個數組,鍵和值都可處理,與foreach功能相同
- bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] )
-
- //棧:後進先出
- 入棧和出棧會從新分配索引下標
- array_push 將一個或多個單元壓入數組的末尾(入棧)
- array_pop 將數組最後一個單元彈出(出棧) 使用此函數後會重置(reset())array 指針。
-
- //隊列:先進先出
- 隊列函數會從新分配索引下標
- array_unshift 在數組開頭插入一個或多個單元
- array_shift 將數組開頭的單元移出數組 使用此函數後會重置(reset())array 指針。
-
- //排序函數
- sort 對數組排序
- rsort 對數組逆向排序
- asort 對數組進行排序並保持索引關係
- arsort 對數組進行逆向排序並保持索引關係
- ksort 對數組按照鍵名排序
- krsort 對數組按照鍵名逆向排序
- usort 使用用戶自定義的比較函數對數組中的值進行排序
- uksort 使用用戶自定義的比較函數對數組中的鍵名進行排序
- uasort 使用用戶自定義的比較函數對數組中的值進行排序並保持索引關聯
- natsort 用用「天然排序」算法對數組排序
- natcasesort 用「天然排序」算法對數組進行不區分大小寫字母的排序
- array_multisort 對多個數組或多維數組進行排序
- shuffle 將數組打亂
- 引用傳遞參數,返回bool值。
- 從新賦予索引鍵名,刪除原有鍵名
-
- //差集
- array_udiff_assoc 帶索引檢查計算數組的差集,用回調函數比較數據
- array_udiff_uassoc 帶索引檢查計算數組的差集,用回調函數比較數據和索引
- array_udiff 用回調函數比較數據來計算數組的差集
- array_diff_assoc 帶索引檢查計算數組的差集
- array_diff_key 使用鍵名比較計算數組的差集
- array_diff_uassoc 用用戶提供的回調函數作索引檢查來計算數組的差集
- array_diff_ukey 用回調函數對鍵名比較計算數組的差集
- array_diff 計算數組的差集
- //交集
- array_intersect_assoc 帶索引檢查計算數組的交集
- array_intersect_key 使用鍵名比較計算數組的交集
- array_intersect_uassoc 帶索引檢查計算數組的交集,用回調函數比較索引
- array_intersect_ukey 用回調函數比較鍵名來計算數組的交集
- array_intersect 計算數組的交集
- array_key_exists 用回調函數比較鍵名來計算數組的交集
- array_uintersect_assoc 帶索引檢查計算數組的交集,用回調函數比較數據
- array_uintersect 計算數組的交集,用回調函數比較數據
-
- extract($arr [,$type [,$prefix]]) 從數組中將變量導入到當前的符號表(接受結合數組$arr做爲參數並將鍵名看成變量名,值做爲變量的值)
- compact($var [,...]) 創建一個數組,包括變量名和它們的值(變量名成爲鍵名而變量的內容成爲該鍵的值)
-
-
-
-
- /* 【僞類型】 */
- mixed 說明一個參數能夠接受多種不一樣的(但並沒必要須是全部的)類型。
- number 說明一個參數能夠是 integer 或者 float。
- callback 回調函數
- void void做爲返回類型意味着函數的返回值是無用的。
- void做爲參數列表意味着函數不接受任何參數。
-
-
- /* 【數據庫操做】 */
- #鏈接認證
- mysql_connect 鏈接並認證數據庫
- #發送SQL語句,接收執行結果
- mysql_query 發送SQL語句
- 僅對select, show, explain, describe語句執行成功返回一個資源標識符,其餘語句成功返回true。執行失敗均返回false。
- #處理結果
- mysql_fetch_assoc 從結果集中取得一行做爲關聯數組
- 每次只取回一條,相似each
- 結果集中記錄指針
- mysql_fetch_row 從結果集中取得一行做爲枚舉數組
- mysql_fetch_array 從結果集中取得一行做爲關聯數組,或數字數組,或兩者兼有
- array mysql_fetch_array ( resource $result [, int $ result_type ] )
- 可選參數result_type可選值爲:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(默認)
- mysql_free_result 釋放結果內存
- #關閉連接
- mysql_close 關閉鏈接
-
-
- /* 【類和對象】 */
- # 成員:
- 類成員:類常量、靜態屬性、靜態方法
- 對象成員:非靜態屬性、非靜態方法
- # 除此外,類不能包含任何其餘東西!!!
-
- # 類名、方法名、屬性名均不區分大小寫
- # $this表明本對象,self表明本類,parent表明父類
- # 類和函數都可被事先編譯(僅做爲最外層時)
- # 類的定義必須在單一的PHP區塊內,不能被多個PHP標籤分割
-
- // 構造方法
- - 具備構造函數的類會在每次建立新對象時先調用此方法
- void __construct([ mixed $args [, $... ]] )
- - 構造方法所需參數由new實例化對象時,給類增長參數值。
- - 構造方法也能夠被手動調用。
- - 5.3.3版本之前,支持於類名同名的方法做爲構造方法。
- - 兩種衝突時,__construct 優先
-
- // 析構方法
- - 析構函數會在到某個對象的全部引用都被刪除或者當對象被顯式銷燬時執行。
- void __destruct( void )
- # 做用:釋放對象所佔用的資源
- # 調用的時機
- - 腳本結束時全部資源均被釋放,包括對象
- - 手動刪除對象時
- - 保存對象的變量被賦予新值時(任何值,包括null)
- - 在使用exit()終止腳本運行時也會被調用
-
- // 靜態成員(static關鍵字)
- - 聲明類成員或方法爲static,就能夠不實例化類而直接訪問。
- - 靜態成員(屬性或方法)均屬於類,故不能經過$this或->訪問。
- - 靜態成員是全部對象共享,屬於類。
- - 靜態成員用類調用,非靜態成員用對象調用。
- # 靜態屬性
- - 靜態屬性不能夠由對象經過->操做符來訪問。
- - 靜態屬性只能被初始化爲一個字符值或一個常量,不能使用表達式。 因此你能夠把靜態屬性初始化爲整型或數組,但不能指向另外一個變量或函數返回值,也不能指向一個對象。
- # 靜態方法
- - 因爲靜態方法不須要經過對象便可調用,因此僞變量$this在靜態方法中不可用。
- - 用::方式調用一個非靜態方法會致使一個E_STRICT級別的錯誤。
-
- // 訪問解析操做符(::)
- - 能夠用於訪問靜態成員、方法和常量,還能夠用於覆蓋類中的成員和方法。
- - 當在類的外部訪問這些靜態成員、方法和常量時,必須使用類的名字。
- - self 和 parent 這兩個特殊的關鍵字是用於在類的內部對成員或方法進行訪問的。
-
- // 訪問辨析
- - 對象成員,內部經過$this指定,外部經過對象名指定,均用->訪問,訪問屬性時不需加$。
- 對象名->屬性名 對象名->方法名() $this->屬性名 $this->方法名()
- - 類成員,內部經過self或parent指定,外部經過類名指定,均用::訪問,訪問屬性時需加$。
- 類名::$屬性名 類名::方法名() self::$屬性名 self::方法名()
- - 特殊:也能夠經過對象訪問類成員。(不建議)
- 對象名::$類屬性名 $this::$類屬性名 對象名::$類方法名() $this::類方法名()
- # 對象成員訪問用->,類成員訪問用::
-
- - 不管是靜態方法仍是非靜態方法,都可經過類或對象進行訪問。
- - 靜態屬性經過類訪問,靜態方法經過對象訪問。
- - 只有使用對象調用非靜態方法時,$this纔可使用!
- - 靜態方法不可以使用$this。
- - 類能夠調用對象方法,但注意方法內不能有$this。
- - 非靜態方法能夠調用靜態屬性或靜態方法,反之不能夠。
-
- // 類常量
- - 常量的值將始終保持不變。
- - 在定義和使用常量的時候不須要使用$符號。
- - 常量的值必須是一個定值,不能是變量,類屬性或其它操做(如函數調用)的結果。
- # 定義:const 常量名 = 常量值;
- - 不須要加public等訪問修飾限定符
- - 類常量屬於類,使用類訪問,類名::類常量 或 self::類常量
-
- // 自動加載對象
- - 在試圖使用還沒有被定義的類時自動調用 __autoload 函數
- - 自動加載使用到的類名文件(根據類名找相應名稱的文件,故需類名與類文件名一致)
- - 每一個須要加載類的文件都須要存在__autoload函數
- - 將__autoload函數寫入單獨的文件,每一個須要用到類的文件再require該函數文件
- - __autoload 參數是類名
- function __autoload($class_name) {
- require_once $_SERVER["DOCUMENT_ROOT"] . "/class/$class_name.php";
- }
- // $_SERVER["DOCUMENT_ROOT"] 當前運行腳本所在的文檔根目錄
- - 能夠經過類名,來推導出類所在的文件名!
- - 若是一個項目存在多個自動加載函數時,定義一個能夠完成加載的普通函數,並在函數以前使用spl_autoload_register註冊該函數。
- # spl_autoload_register
- - 註冊__autoload()函數
- bool spl_autoload_register ([ callback $autoload_function ] )
- - 能夠註冊多個自動加載函數,先註冊的先執行
- - 一旦註冊自動加載函數,__autoload就失效。
- - 註冊函數時,參數爲函數名(注意加引號);註冊方法時,參數爲數組
- # 註冊類或對象的方法爲自動加載方法時,參數需爲數組:
- spl_autoload_register(array(__CLASS__, '__autoload'));
- __CLASS__表示當前類名,如果對象可用$this,詳細見手冊
-
- // 序列化(串行化)
- # 數據傳輸均是字符串類型
- # 除了資源類型,都可序列化
- # 序列化在存放數據時,會存放數據自己,也會存放數據類型
- 做用:1.在網絡傳輸數據時;2.爲了將數組或對象放在磁盤時
- # 序列化
- serialize 產生一個可存儲的值的表示
- string serialize ( mixed $value )
- - 返回字符串,此字符串包含了表示value的字節流,能夠存儲於任何地方。
- - 有利於存儲或傳遞 PHP 的值,同時不丟失其類型和結構。
- # 反序列化
- unserialize 從已存儲的表示中建立PHP的值
- mixed unserialize ( string $str [, string $callback ] )
- - 對單一的已序列化的變量進行操做,將其轉換回PHP的值。
-
-
- # 文件的讀寫操做
- - file_put_contents 將一個字符串寫入文件
- int file_put_contents($file, $data [,$flags])
- $flags:FILE_USE_INCLUDE_PATH(覆蓋),FILE_APPEND(追加)
- - file_get_contents 將整個文件讀入一個字符串
- string file_get_contents($file [, bool $use_include_path [,int $offset [,int $maxlen]]])
-
- # 對象序列化
- - 只能序列化對象內部的數據,即非靜態屬性。
- # 需在反序列化對象以前加載類,也能夠觸發自動加載機制。
-
- __sleep 序列化需序列化的屬性。
- - 提交未提交的數據,或相似的清理操做,部分串行化對象。
- - 返回一個包含對象中全部應被序列化的變量名稱的數組
- __wakeup 反序列化時,預先準備對象須要的資源
- - 從新創建數據庫鏈接,或執行其它初始化操做
- public function __sleep() {
- return array('server', 'username', 'password', 'db');
- }
- public function __wakeup() {
- $this->connect();
- }
-
- // 對象繼承
- class 子類名 extends 父類 {}
- 若是一個對象是子類的對象,那麼同時也是父類的對象。
- 單繼承:一個類只能繼承一個父類,不能同時繼承多個類。但一個父類能夠被多個子類繼承。
-
- instanceof 判斷某對象是否爲某類的對象
- 對象名 instanceof 類名
-
- // 訪問控制
- public 公有的(繼承鏈、本類、外部都可訪問)
- protected 保護的(僅繼承鏈、本類可訪問)
- private 私有的(僅本類可訪問)
- 根據成員定義位置、訪問位置判斷。
- # 兼容性問題
- - 聲明屬性時,var關鍵字聲明的默認爲public權限
- - 聲明方法時,省略訪問修飾符,默認爲public權限
-
- // 重寫 override
- $this表明本對象,被誰調用,就表明哪一個對象。
- - 繼承時,子類成員名於父類成員名發生衝突,則子類成員會重寫父類成員。
- - 屬性和方法都可被子類重寫。
- - 當父類的方法或屬性已經不知足子類的需求,則須要重寫。
- - 也可能由於命名不規範致使重寫。
-
- 私有屬性不能被重寫,每一個私有屬性都會被記錄。在記錄屬性名的同時,還會記錄類。
-
- 若是有內置函數被重寫,則可調用父類方法。如調用父類構造方法parent::__construct()
-
- # 重寫限制
- 訪問限制:
- 子類的成員的訪問控制必須相等或弱於父類。
- 方法參數限制:
- 參數數量必須相同,參數名可不一樣。
-
- # $this肯定原則
- $this爲調用該方法的對象,表示該方法的執行環境對象。
- - 對象調用
- - 環境的傳遞。若是當前調用時,不能肯定$this的值(靜態調用),此時靜態調用所處對象環境會傳遞到被調用的方法內。
- $this並不是永遠表明本對象,而是由方法的執行環境決定。
-
- # final
- 若是父類中的方法被聲明爲final,則子類沒法覆蓋(重寫)該方法。
- 若是一個類被聲明爲final,則不能被繼承。
- 但加有final關鍵字的類依舊能被實例化!
- # 抽象類
- 關鍵字:abstract
- 抽象類不能直接被實例化,必須先繼承該抽象類,而後再實例化子類。
- 抽象類中至少要包含一個抽象方法。非抽象類不能包含抽象方法。
- 若是類方法被聲明爲抽象的,那麼其中就不能包括具體的功能實現。抽象方法不能包含大括號及方法體。
- 繼承一個抽象類的時候,子類必須實現抽象類中的全部抽象方法。
- 即,子類必須重寫抽象父類中的全部抽象方法。
- 另外,這些方法的可見性必須和抽象類中同樣(或者更爲寬鬆)。
- 即,若是抽象類中某個抽象方法被聲明爲protected,那麼子類中實現的方法就應該聲明爲protected或者public,而不能定義爲private。
- - 抽象類的子類中的普通方法執行方式和其餘類相同。
- - 做用:
- 1. 繼承,爲擴展類,統一公共操做。
- 2. 限制結構(規範)。規範子類的結構。
-
- // 接口
- 關鍵字:interface
- - 對象提供的與對象交互的方式就是接口。
- - 使用接口能夠指定某個類必須實現哪些方法,但不須要定義這些方法的具體內容。
- - 經過interface來定義一個接口,就像定義一個標準的類同樣,但其中定義全部的方法都是空的。
- - 接口中定義的全部屬性和方法都必須是public,可省略public關鍵字。
- - 接口中也能夠定義常量(const)。接口常量和類常量的使用徹底相同。
- 能夠用::訪問。接口名::常量名,實現類::常量名。
- 它們都是定值,能夠被子類或子接口使用,但不能修改。
- - 接口不能定義屬性!
- # 定義接口
- interface 接口名 {
- 接口內容(公共方法聲明的集合)
- }
- # 接口實現
- - 要實現一個接口,可使用implements操做符。
- - 類中必須實現接口中定義的全部方法,不然會報一個fatal錯誤。
- - 若是要實現多個接口,能夠用逗號來分隔多個接口的名稱。
- - 實現多個接口時,接口中的方法不能有重名。
- - 接口也能夠繼承,經過使用extends操做符。
- class 類名 implements 接口名 {
- 接口方法的實現
- }
- # 注意
- 1. 類與抽象類之間是繼承關係,類與接口之間是實現關係。
- 2. 類與抽象類是單繼承,類與接口是多實現。
- 3. 接口不是類,限制類的結構。
- 4. 接口與接口之間是多繼承。用extends關鍵字。
- interface I_C extends I_A, I_B {}
-
- // 靜態延遲綁定
- self::,表明本類(當前代碼所在類)
- 永遠表明本類,由於在類編譯時已經被肯定。
- 即,子類調用父類方法,self卻不表明調用的子類。
- static::,表明本類(調用該方法的類)
- 用於在繼承範圍內引用靜態調用的類。
- 運行時,才肯定表明的類。
- static::再也不被解析爲定義當前方法所在的類,而是在實際運行時計算的。
-
- // 對象的遍歷(迭代)
- - 對象經過屬性保存數據,故遍歷對象的屬性。
- - foreach語言結構,得到屬性名和屬性值。
- foreach ($obj as $p_name => $p_value) {}
- # 自定義遍歷(迭代器Iterator)
- Iterator - 可在內部迭代本身的外部迭代器或類的接口
- Iterator::current — 返回當前元素
- Iterator::key — 返回當前元素的鍵
- Iterator::next — 向前移動到下一個元素
- Iterator::rewind — 返回到迭代器的第一個元素
- Iterator::valid — 檢查當前位置是否有效
-
- # 對象的克隆
- //對象之間的傳值是[引用]傳遞。
- 克隆:新對象 = clone 舊對象
- - 全部的引用屬性仍然會是一個指向原來的變量的引用。
- __clone()方法在對象被克隆時自動調用。
- 注意:構造方法對應實例化(new),克隆方法對應克隆(clone)。
-
- // 單例模式
- #三私一公
- 單例模式(Singleton)用於爲一個類生成一個惟一的對象。最經常使用的地方是數據庫鏈接。使用單例模式生成一個對象後,該對象能夠被其它衆多對象所使用。
- # 防止一個類被實例化屢次
- class MySQLDB {
- private static $instance = null; // 存類實例在此屬性中
- // 構造方法聲明爲private,防止直接建立對象
- private function __construct() {}
- public static function getInstance() {
- if(! self::$instance instanceof static) {
- self::$instance = new static;
- }
- return self::$instance;
- }
- private function __clone() {} // 阻止用戶複製對象實例
- }
-
- // 魔術方法
- __construct 構造方法
- __destruct 析構方法
- __clone 克隆對象
- __sleep 序列化對象
- __wakeup 反序列化對象
- __autoload 自動加載,使用類但未找到時
-
- __toString 對象被看成字符串使用時
- __invoke 當嘗試以調用函數的方式調用一個對象時
-
- # 重載 overload
- 指動態地"建立"類屬性和方法
- 用戶能夠自由的爲對象添加額外的屬性,該特性就是重載。
- 全部的重載方法都必須被聲明爲public。
- 當調用當前環境下未定義或不可見的類屬性或方法時,重載方法會被調用。
- 重載相關魔術方法的參數都不能經過引用傳遞。
- # 屬性重載
- - 處理不可訪問的屬性
- 屬性重載只能在對象中進行。
- # 屬性重載對於靜態屬性無效
- 在靜態方法中,這些魔術方法將不會被調用。因此這些方法都不能被聲明爲static。
- __set 在給不可訪問的屬性賦值時
- public void __set(string $name, mixed $value)
- 做用:批量管理私有屬性,間接保護對象結構
- __get 讀取不可訪問的屬性的值時
- public mixed __get(string $name)
- __isset 當對不可訪問的屬性調用isset()或empty()時
- public bool __isset(string $name)
- __unset 當對不可訪問的屬性調用unset()時
- public void __unset(string $name)
- # 方法重載
- - 處理不可訪問的方法
- __call 當調用一個不可訪問的非靜態方法(如未定義,或者不可見)時自動被調用
- public mixed __call(string $name, array $arguments)
- __callStatic 當在調用一個不可訪問的靜態方法(如未定義,或者不可見)時自動被調用
- public static mixed __callStatic(string $name, array $arguments)
- # $name參數是要調用的方法名稱。$arguments參數是一個數組,包含着要傳遞給方法的參數。
-
- // 類型約束
- 函數的參數能夠指定只能爲對象或數組
- 限定爲對象則在形參前加類名,限定爲數組則在形參前加array
- 類型約束容許NULL值
- 類型約束不僅是用在類的成員方法裏,也能使用在函數裏。
-
- // 三大特性
- 封裝:隱藏內部是吸納,僅開發接口。
- 繼承:一個對象的成員被另外一個對象所使用。語法上體現爲代碼的共用。
- 多態:多種形態。
-
- // 類與對象·關鍵字
- this 表明本對象
- public 公有的(繼承鏈、本類、外部都可訪問)
- protected 保護的(僅繼承鏈、本類可訪問)
- private 私有的(僅本類可訪問)
- parent:: 表明父類
- self:: 表明本類(當前代碼所在類)
- static:: 表明本類(調用該方法的類)
- static 靜態成員(屬性、方法),全部對象都可使用,外部也可直接使用或修改,靜態方法不可訪問非靜態成員
- final 方法用final不可被子類重載,類用final不可被繼承(方法、類)
- const 類常量(屬性)
- abstract 抽象類
- interface 接口
- extends 類繼承(子接口繼承接口、其餘普通類繼承)
- implements 接口實現(類實現接口、抽象類實現藉口)(對接口的實現和繼承都可有多個)
- Iterator 內置接口(迭代)
- clone 克隆
- instance 實例
- instanceof 某對象是否屬於某類
-
- /* 【類與對象相關函數】 */
- class_alias([$original [,$alias]]) 給類取別名
- class_exists($class [,$autoload]) 檢查類是否已定義
- interface_exists($interface [,$autoload]) 檢查接口是否已被定義
- method_exists($obj, $method)檢查類的方法是否存在
- property_exists($class, $property) 檢查對象或類是否具備該屬性
- get_declared_classes(void) 返回由已定義類的名字所組成的數組
- get_declared_interfaces(void) 返回一個數組包含全部已聲明的接口
- get_class([$obj]) 返回對象的類名
- get_parent_class([$obj]) 返回對象或類的父類名
- get_class_methods($class) 返回由類的方法名組成的數組
- get_object_vars($obj) 返回由對象屬性組成的關聯數組
- get_class_vars($class) 返回由類的默認屬性組成的數組
- is_a($obj, $class) 若是對象屬於該類或該類是此對象的父類則返回TRUE
- is_subclass_of($obj, $class) 若是此對象是該類的子類,則返回TRUE
- get_object_vars($obj) 返回由對象屬性組成的關聯數組
-
-
- // 經常使用類
- # PHP手冊 -> 預約義類
- Closure 閉包類,匿名函數對象的final類
- stdClass 標準類,一般用於對象類保存集合數據
- __PHP_Incomplete_Class 不完整類,當只有對象而沒有找到類時,則該對象被認爲是該類的對象
- Exception 異常類
- PDO 數據對象類
-
- // 魔術常量
- __DIR__ 文件所在的目錄
- __LINE__ 文件中的當前行號
- __FILE__ 文件的完整路徑(絕對路徑)和文件名
-
- __CLASS__ 類的名稱
- __METHOD__ 類的方法名,包含類名和方法名
- __FUNCTION__ 函數名稱,用在方法內只表示方法名
-
- // 反射機制 Reflection
- 做用:1. 獲取結構信息 2. 代理執行
- ReflectionClass 報告一個類的有關信息
- ReflectionMethod 報告一個方法的有關信息
- ReflectionClass::export 輸出類結構報告
- # 代理執行
- 實例化 ReflectionFunction 類的對象
- $f = new ReflectionFunction('func'); // func爲函數func($p)
- $f->invoke('param');
-
-
- /* 頁面跳轉 */
- // PHP
- header('Loacation: url')
- header()執行完畢後,後面的代碼也會繼續執行,故需在該語句後加die結束
- 沒法給出提示,直接跳轉
- // JS方法
- location.href = url
- // HTML
- <meta http-equiv="Refresh" content="表示時間的數值; url=要跳轉的URI">
-
- /* 【Cookie】 */
- cookie是一種在遠程瀏覽器端儲存數據並以此來跟蹤和識別用戶的機制。
- cookie是HTTP標頭的一部分,所以setcookie()函數必須在其它信息被輸出到瀏覽器前調用,這和對header()函數的限制相似。可使用輸出緩衝函數來延遲腳本的輸出,直到按須要設置好了全部的cookie或者其它HTTP標頭。
-
- // 新增
- setcookie 新增一條cookie信息
- setcookie($name [,$value [,$expire [,$path [,$domain [,$secure [,$httponly]]]]]])
- #注意:setcookie()函數前不能有輸出!除非開啓ob緩存!
- # 參數說明
- $name - cookie的識別名稱
- 使用$_COOKIE['name']抵用名爲name的cookie
- $value - cookie值,能夠爲數值或字符串,此值保存在客戶端,不要用來保存敏感數據
- 假定$name參數的值爲'name',則$_COOKIE['name']就可取得該$value值
- $expire - cookie的生存期限(Unix時間戳,秒數)
- 若是$expire參數的值爲time()+60*60*24*7則可設定cookie在一週後失效。若是未設定該參數,則會話後當即失效。
- $path - cookie在服務器端的指定路徑。當設定該值時,服務器中只有指定路徑下的網頁或程序能夠存取該cookie。
- 若是該參數值爲'/',則cookie在整個domain內有效。
- 若是設爲'/foo/',則cookie就在domain下的/foo/目錄及其子目錄內有效。
- 默認值爲設定cookie的當前目錄及其子目錄。
- $domain - 指定此cookie所屬服務器的網址名稱,預設是創建此cookie服務器的網址。
- 要是cookie能在如abc.com域名下的全部子域都有效,則該參賽應設爲'.abc.com'。
- $secure - 指明cookie是否僅經過安全的HTTPS鏈接傳送中的cookie的安全識別常數,若是設定該值則表明只有在某種狀況下才能在客戶端與服務端之間傳遞。
- 當設成true時,cookie僅在安全的鏈接中被設置。默認值爲false。
-
- // 讀取
- - 瀏覽器請求時會攜帶當前域名下的全部cookie信息到服務器。
- - 任何從客戶端發送的cookie都會被自動存入$_COOKIE全局數組。
- - 若是但願對一個cookie變量設置多個值,則需在cookie的名稱後加[]符號。即以數組形態保存多條數據到同一變量。
- //設置爲$_COOKIE['user']['name'],注意user[name]的name沒有引號
- setcookie('user[name]', 'shocker');
- - $_COOKIE也能夠爲索引數組
-
- // 刪除
- 方法1:將其值設置爲空字符串
- setcookie('user[name]', '');
- 方法2:將目標cookie設爲「已過時」狀態。
- //將cookie的生存時間設置爲過時,則生存期限與瀏覽器同樣,當瀏覽器關閉時就會被刪除。
- setcookie('usr[name]', '', time()-1);
-
- # 注意:
- 1. cookie只能保存字符串數據
- 2. $_COOKIE只用於接收cookie數據,不用於設置或管理cookie數據。
- 對$_COOKIE進行操做不會影響cookie數據。
- $_COOKIE只會保存瀏覽器在請求時所攜帶的cookie數據。
- 3. cookie生命週期:
- 臨時cookie:瀏覽器關閉時被刪除
- 持久cookie:$expire參數爲時間戳,表示失效時間。
- 4. 有效目錄
- cookie只在指定的目錄有效。默認是當前目錄及其子目錄。
- 子目錄的cookie在其父目錄或同級目錄不可獲取。
- 5. cookie區分域名
- 默認是當前域名及其子域名有效。
- 6. js中經過document.cookie得到,類型爲字符串
- 7. 瀏覽器對COOKIE總數沒有限制,但對每一個域名的COOKIE數量和每一個COOKIE的大小有限,並且不一樣瀏覽器的限制不一樣。
-
- /* 【session】 */
- 1. 開啓session機制
- session_start()
- 注意:session_start()函數前不能有輸出!除非開啓ob緩存。
- 2. 操做數據
- 對$_SESSION數組進行操做
- 3. 瀏覽器端保存SessionID,默認爲當前域名下的全部目錄及其子目錄生效。即默認設置cookie的path值爲'/'
- 4. 服務器保存session數據
- 默認保存方式:每一個會話都會生成一個session數據文件,文件名爲:sess_加SessionID
- 5. session能夠存儲除了資源之外的任何類型數據。
- 數據被序列化後再保存到文件中。
- 6. $_SESSION的元素下標不能爲整型!
- 由於只對元素值進行序列化。
- 元素內的數組下標無此要求。
- 7. 生存週期
- 默認是瀏覽器關閉
- 由於瀏覽器保存的cookie變量SessionID是臨時的
- 可是服務器端的session數據文件不必定消失(須要等待session的垃圾回收機制來處理)
- 能夠延長cookie中PHPSESSID變量的生命週期。(不推薦)
- php.ini配置session.gc_maxlifetime
- 8. 刪除數據
- $_SESSION變量在腳本結束時依然會消失。開啓session機制時會造出$_SESSION變量。
- $_SESSION與保存session數據的文件是兩個空間。
- unset($_SESSION['key'])只是刪除數組內的該元素,不會當即相應到保存session數據的文件上。
- 等到腳本結束,纔會將$_SESSION的數據寫入到該文件中。
- session_destroy() 銷燬保存session數據的文件,也不會對該文件寫入內容。
- 並不刪除$_SESSION變量,unset或腳本結束纔會刪除該變量。
- 如何徹底刪除一個session?需刪除3部分
- unset($_SESSION);
- 刪除$_SESSION變量後,數據文件並未被改動。若是單獨使用unset,則需先置空$_SESSION = array()
- session_destroy();
- setcookie('PHPSESSID', '', time()-1); //保險作法是將其生命週期失效
- 整個腳本週期內,只對數據文件讀一次、寫一次。
-
- // 重寫session的存儲機制
- # session存儲方式
- session.save_handler = user|files|memcache
- # 因數據文件過多致使的問題,可經過分子目錄保存進行解決
- PHP配置文件下session.save_path選項,並需手動建立數據存放目錄。
- 在該配置選項前加層級。分佈子目錄的原則,利用會話ID的相應字母來分配子目錄。仍需手動建立子目錄。
- session.save_path = "2; F:/PHPJob/Temp"
- # 多服務器數據共享問題
- # 數據存儲操做:
- 初始化$open、釋放資源$close、讀$read、寫$write、銷燬存儲介質$destroy(調用session_destroy時觸發該操做)、垃圾回收$gc
- # 會話ID的長度可變。不一樣的設置方式致使不一樣長度的會話ID。
- session.hash_function 容許用戶指定生成會話ID的散列算法。
- '0' 表示MD5(128 位),'1' 表示SHA-1(160 位)。
- session.hash_bits_per_character 容許用戶定義將二進制散列數據轉換爲可讀的格式時每一個字符存放多少個比特。
- 可能值爲 '4'(0-9,a-f),'5'(0-9,a-v),以及 '6'(0-9,a-z,A-Z,"-",",")。
- 總hash長度爲128bit,會話ID長度爲128/可能值,4->32, 5->26, 6->22
- # 自定義數據存儲操做方法
- # 注意:不用關心PHP如何序列化、反序列化、如何獲得數據和寫入數據,只作與數據存儲相關的操做
- session_set_save_handler 設置用戶自定義的會話數據存儲函數
- bool session_set_save_handler(callable $open, callable $close, callable $read, callable $write, callable $destroy, callable $gc)
- 執行順序:open, close, read, write, destroy, gc
- # 先設置處理器,再開啓會話
-
- # 經常使用函數
- session_start 開啓或恢復會話機制
- session_id 獲取或設置當前會話ID
- session_destroy 銷燬當前會話的全部數據(銷燬數據文件)
- session_name 獲取或設置當前會話名稱(cookie變量名,默認爲PHPSESSID)
- session_save_path 獲取或設置當前會話數據文件保存路徑
- session_set_save_handler 設置用戶自定義的會話數據存儲函數
- session_unset 釋放全部會話變量(清空$_SESSION數組元素)
- session_encode 將當前會話數據編碼爲一個字符串
- session_decode 將字符串解譯爲會話數據
- session_write_close 寫入會話數據並關閉會話
- session_register_shutdown 關閉會話
- session_set_cookie_params 設置會話cookie變量,必須在session_start()前使用。
- session_set_cookie_params(0,"/webapp/"); //設置session生存時間
- session_get_cookie_params 獲取會話cookie變量。返回包含當前會話cookie信息的數組
-
- # 配置php.ini
- ini_set($varname, $newvalue);
- //該函數的配置只對當前腳本生效
- //並不是全部php.ini設置都可用該函數設置
- ini_get($varname) //獲取某配置項信息
- ini_get_all([str $extension]) //返回全部配置項信息的數組
-
- # session擴展配置
- session.name 指定會話名以用做cookie的名字。只能由字母數字組成,默認爲PHPSESSID。
- session.save_path 定義了傳遞給存儲處理器的參數。
- 若是選擇了默認的files文件處理器,則此值是建立文件的路徑。默認爲/tmp。
- 可選的N參數來決定會話文件分佈的目錄深度。
- 要使用N參數,必須在使用前先建立好這些目錄。在ext/session目錄下有個小的shell腳本名叫mod_files.sh能夠用來作這件事。
- 若是使用了N參數而且N大於0,那麼將不會執行自動垃圾回收。
- session.save_handler 定義了來存儲和獲取與會話關聯的數據的處理器的名字。默認爲files。
- 若是用戶自定義存儲器,則該值改成user。
- ini_set('session.save_handler', 'user');//此設置只針對當前腳本生效。
- session.auto_start 指定會話模塊是否在請求開始時自動啓動一個會話。默認爲 0(不啓動)。
- session.gc_probability與session.gc_divisor合起來定義了在每一個會話初始化時啓動gc(garbage collection 垃圾回收)進程的機率。此機率用 gc_probability/gc_divisor 計算得來。例如 1/100 意味着在每一個請求中有 1% 的機率啓動gc進程。session.gc_divisor默認爲100。session.gc_probability默認爲1。
-
-
- /* 【圖片生成與處理】 */GD庫
- // 畫布生成
- # 新建畫布
- imagecreate 新建一個基於調色板的圖像
- resource imagecreate(int $x_size, int $y_size)
- imagecreatetruecolor 新建一個真彩色圖像
- # 基於已有文件或URL建立畫布
- imagecreatefromgd2 從GD2文件或URL新建一圖像
- imagecreatefromgd2part 從給定的GD2文件或URL中的部分新建一圖像
- imagecreatefromgd 從GD文件或URL新建一圖像
- imagecreatefromgif 由文件或URL建立一個新圖象
- imagecreatefromjpeg 由文件或URL建立一個新圖象
- imagecreatefrompng 由文件或URL建立一個新圖象
- imagecreatefromstring 從字符串中的圖像流新建一圖像
- imagecreatefromwbmp 由文件或URL建立一個新圖象
- imagecreatefromxbm 由文件或URL建立一個新圖象
- imagecreatefromxpm 由文件或URL建立一個新圖象
- // 顏色分配
- imagecolorallocate 爲一幅圖像分配顏色
- int imagecolorallocate(resource $image, int $red, int $green, int $blue)
- imagecolorallocatealpha 爲一幅圖像分配顏色 + alpha
- imagecolordeallocate 取消圖像顏色的分配
- imagecolortransparent 將某個顏色定義爲透明色
- imagecolorat 取得某像素的顏色索引值
- imagecolorclosest 取得與指定的顏色最接近的顏色的索引值
- imagecolorclosestalpha 取得與指定的顏色加透明度最接近的顏色
- imagecolorclosesthwb 取得與給定顏色最接近的色度的黑白色的索引
- imagecolorexact 取得指定顏色的索引值
- imagecolorexactalpha 取得指定的顏色加透明度的索引值
- imagecolormatch 使一個圖像中調色板版本的顏色與真彩色版本更能匹配
- imagecolorresolve 取得指定顏色的索引值或有可能獲得的最接近的替代值
- imagecolorresolvealpha 取得指定顏色 + alpha 的索引值或有可能獲得的最接近的替代值
- imagecolorset 給指定調色板索引設定顏色
- imagecolorsforindex 取得某索引的顏色
- imagecolorstotal 取得一幅圖像的調色板中顏色的數目
- // 區域填充
- imagefill 區域填充
- bool imagefill(resource $image, int $x, int $y, int $color)
- imagefilledarc 畫一橢圓弧且填充
- imagefilledellipse 畫一橢圓並填充
- imagefilledpolygon 畫一多邊形並填充
- imagefilledrectangle 畫一矩形並填充
- imagefilltoborder 區域填充到指定顏色的邊界爲止
- imagesettile 設定用於填充的貼圖
- // 圖形建立
- imagearc 畫橢圓弧
- imagechar 水平地畫一個字符
- imagecharup 垂直地畫一個字符
- imagedashedline 畫一虛線
- imageellipse 畫一個橢圓
- imageline 畫一條線段
- imagepolygon 畫一個多邊形
- imagerectangle 畫一個矩形
- imagesetpixel 畫一個單一像素
- imagesx 取得圖像寬度
- imagesy 取得圖像高度
- // 畫筆設置
- imagesetbrush 設定畫線用的畫筆圖像
- imagesetstyle 設定畫線的風格
- imagesetthickness 設定畫線的寬度
- // 圖形拷貝
- imagecopy 拷貝圖像的一部分
- imagecopymerge 拷貝併合並圖像的一部分
- imagecopymergegray 用灰度拷貝併合並圖像的一部分
- imagecopyresampled 重採樣拷貝部分圖像並調整大小
- imagecopyresized 拷貝部分圖像並調整大小
- // 字符建立
- imagestring 水平地畫一行字符串
- imagestringup 垂直地畫一行字符串
- imagepsslantfont 傾斜某字體
- imagefontheight 取得字體高度
- imagefontwidth 取得字體寬度
- imagettfbbox 取得使用 TrueType 字體的文本的範圍
- imageloadfont 載入一新字體
- imagepsencodefont 改變字體中的字符編碼矢量
- imagepsextendfont 擴充或精簡字體
- // 導出畫布爲圖片
- imagegif 以GIF格式將圖像輸出到瀏覽器或文件
- imagepng 以PNG格式將圖像輸出到瀏覽器或文件
- imagejpeg 以JPEG格式將圖像輸出到瀏覽器或文件
- imagewbmp 以WBMP格式將圖像輸出到瀏覽器或文件
- 經過header()發送 "Content-type: image/圖片格式" 可使PHP腳本直接輸出圖像。
- header("Content-type: image/gif"); imagegif($im);
- imagegd 將 GD 圖像輸出到瀏覽器或文件
- imagegd2 將 GD2 圖像輸出到瀏覽器或文件
- // 釋放畫布資源
- imagedestroy 銷燬圖像
- // 圖像信息
- image_type_to_extension 取得圖像類型的文件後綴
- getimagesize 取得圖像大小
- imagesx 取得圖像寬度
- imagesy 取得圖像高度
- imageistruecolor 檢查圖像是否爲真彩色圖像
- imagetypes 返回當前 PHP 版本所支持的圖像類型
- // 圖像設置
- imagerotate 用給定角度旋轉圖像
- imagealphablending 設定圖像的混色模式
- imageantialias 是否使用抗鋸齒(antialias)功能
- imagefilter 對圖像使用過濾器
- imagegammacorrect 對 GD 圖像應用 gamma 修正
- imageinterlace 激活或禁止隔行掃描
-
- /* 【縮略圖】【水印】 */
- imagecopyresampled 重採樣拷貝部分圖像並調整大小
- bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
- imagecopymerge 拷貝併合並圖像的一部分
- bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
- getimagesize 取得圖像大小
- array getimagesize ( string $filename [, array &$imageinfo ] )
-
- /* 【URL函數】 */
- get_headers — 取得服務器響應一個 HTTP 請求所發送的全部標頭
- get_meta_tags — 從一個文件中提取全部的 meta 標籤 content 屬性,返回一個數組
- http_build_query — 生成 URL-encode 以後的請求字符串
- urldecode — 解碼已編碼的URL字符串
- urlencode — 編碼URL字符串
- parse_url — 解析URL,返回其組成部分
- 'http://username:password@hostname/path?arg=value#anchor'
- scheme(如http), host, port, user, pass, path, query(在問號?以後), fragment(在散列符號#以後)
-
-
- //編碼可用於交換多個變量
- $a = '中國';
- $b = '四川';
- $a = urlencode($a);
- $b = urlencode($b);
- $a = $a.'&'.$b;
- $b = explode('&', $a);
- $a = urldecode($b[1]);
- $b = urldecode($b[0]);
- echo $a, $b;
- //list()函數用於交換變量
- list($a, $b) = array($b, $a);
-
-
- /* 【文件、目錄】 */
- dirname($path) 返回路徑中的目錄部分
- basename($path [,$suffix]) 返回路徑中的文件名部分
- pathinfo($path [,$options]) 返回文件路徑的信息(數組元素:dirname,basename,extension)
- realpath($path) 返回規範化的絕對路徑名
-
- copy($source, $dest) 拷貝文件
- unlink($file) 刪除文件
- rename($old, $new) 重命名或移動一個文件或目錄
- mkdir($path [,$mode [,$recursive]]) 新建目錄
- $mode表示權限,默認0777
- $recursive表示可建立多級目錄,默認false
- rmdir($dir) 刪除目錄(目錄必須爲空,且具備權限)
-
- file_exists($file) 檢查文件或目錄是否存在
- is_file($file) 判斷文件是否存在且爲正常的文件
- is_dir($file) 判斷文件名是否存在且爲目錄
- is_readable($file) 判斷文件或目錄是否可讀
- is_writable($file) 判斷文件或目錄是否可寫
- is_executable($file) 判斷給定文件名是否可執行
- is_link($file) 判斷給定文件名是否爲一個符號鏈接
-
- tmpfile(void) 創建一個臨時文件
- tempnam($dir, $prefix) 在指定目錄中創建一個具備惟一文件名的文件
-
- file($file) 把整個文件讀入一個數組中
- fopen($filename, $mode [,$use_include_path])
- $mode參數:(加入'b'標記解決移植性)
- 'r' 只讀方式打開,將文件指針指向文件頭。
- 'r+' 讀寫方式打開,將文件指針指向文件頭。
- 'w' 寫入方式打開,將文件指針指向文件頭並將文件大小截爲零。若是文件不存在則嘗試建立之。
- 'w+' 讀寫方式打開,將文件指針指向文件頭並將文件大小截爲零。若是文件不存在則嘗試建立之。
- 'a' 寫入方式打開,將文件指針指向文件末尾。若是文件不存在則嘗試建立之。
- 'a+' 讀寫方式打開,將文件指針指向文件末尾。若是文件不存在則嘗試建立之。
- 'x' 建立並以寫入方式打開,將文件指針指向文件頭。
- 'x+' 建立並以讀寫方式打開,將文件指針指向文件頭。
- fclose($handle) 關閉一個已打開的文件指針
- fread($handle, $length) 讀取文件(可安全用於二進制文件)
- fwrite($handle, $string [,$length]) 寫入文件(可安全用於二進制文件)
- rewind($handle) 倒回文件指針的位置
- ftell($handle) 返回文件指針讀/寫的位置
- fseek($handle, $offset [,$whence]) 在文件指針中定位
- feof($handle) 測試文件指針是否到了文件結束的位置
- fgets 從文件指針中讀取一行
- fgetss 從文件指針中讀取一行並過濾掉HTML標記
- flock($handle, $opt) 輕便的諮詢文件鎖定
- $opt:LOCK_SH 取得共享鎖定(讀取的程序);LOCK_EX 取得獨佔鎖定(寫入的程序);LOCK_UN 釋放鎖定(不管共享或獨佔)
-
-
- readfile($file) 讀入一個文件並寫入到輸出緩衝
- fflush($handle) 將緩衝內容輸出到文件
-
- touch($file [,$time [,$atime]]) 設定文件的訪問和修改時間
- fileatime 取得文件的上次訪問時間
- filectime 取得文件的inode修改時間
- filegroup 取得文件的組
- fileinode 取得文件的inode
- filemtime 取得文件修改時間
- fileowner 取得文件的全部者
- fileperms 取得文件的權限
- filesize 取得文件大小
- filetype 取得文件類型
-
-
- /* fileinfo */ 獲取/設置文件信息
- #擴展Fileinfo,配置php.ini
- #extension=php_fileinfo.dll
- finfo_open([$opt]) //建立一個文件信息資源
- finfo_file($finfo, $file [,$opt]) //獲取文件信息
- finfo_set_flags($finfo, $opt) //設置文件信息項
- finfo_close($finfo) //關閉文件信息資源
-
- mime_content_type($file) //獲取文件的MIME類型
-
- $opt參數選項:
- FILEINFO_MIME_ENCODING 文件編碼類型
- FILEINFO_MIME_TYPE 文件MIME類型
-
-
- //目錄
- chdir($dir) 改變當前目錄
- chroot($dir) 將當前目錄改變爲當前進程的根目錄
- closedir($handle) 關閉目錄句柄
- dir($dir) 返回一個目錄的實例對象
- getcwd() 取得當前工做目錄
- opendir($path) 打開目錄句柄
- readdir($handle) 從目錄句柄中讀取條目
- rewinddir($handle) 倒回目錄句柄
- scandir($dir [,$order]) 列出指定路徑中的文件和目錄
- glob($pattern [,$flags]) 尋找與模式匹配的文件路徑
- $flags:
- GLOB_MARK - 在每一個返回的項目中加一個斜線
- GLOB_NOSORT - 按照文件在目錄中出現的原始順序返回(不排序)
- GLOB_NOCHECK - 若是沒有文件匹配則返回用於搜索的模式
- GLOB_NOESCAPE - 反斜線不轉義元字符
- GLOB_BRACE - 擴充 {a,b,c} 來匹配 'a','b' 或 'c'
- GLOB_ONLYDIR - 僅返回與模式匹配的目錄項
- 查找多種後綴名文件:glob('*.{php,txt}', GLOB_BRACE);
-
-
- /* 解壓縮 */
- //新建ZipArchive對象
- $zip = new ZipArchive;
- //打開ZIP文件
- $zip->open($file [,$flags]);
- $flags:
- ZIPARCHIVE::OVERWRITE 覆蓋(不存在會自動建立)
- ZIPARCHIVE::CREATE 添加(不存在會自動建立)
- ZIPARCHIVE::EXCL
- ZIPARCHIVE::CHECKCONS
- //關閉正在處理的ZIP文件
- //解壓縮ZIP文件
- $zip->extractTo($dest, [$entries]);
- $dest:解壓到的文件夾,$entries:解壓的條目
- //添加文件到ZIP文件
- $zip->addFile($file, [$newname]);
- $newname能夠爲"dir/file",這樣能夠將文件添加到壓縮文件中的某個目錄下。其餘函數也如此。
- //添加文件到ZIP文件,而內容來自字符串
- $zip->addFromString($file, $str);
- //添加空文件夾到ZIP文件
- $zip->addEmptyDir($dir);
- //經過索引刪除ZIP中的文件或文件夾
- $zip->deleteIndex($index);
- //經過名稱刪除ZIP中的文件或文件夾
- $zip->deleteName($name);
- //設置ZIP文件註釋
- $zip->setArchiveComment($str);
- //獲取ZIP文件註釋
- $zip->getArchiveComment();
- //經過索引獲取文件內容
- $zip->getFromIndex($index);
- //經過名稱獲取文件內容
- $zip->getFromName($name);
- //獲取索引文件的文件名稱
- $zip->getNameIndex($index);
- //經過索引重命名文件
- $zip->renameIndex($index, $newname);
- //經過名稱重命名文件
- $zip->renameName($name, $newname);
-
- //若將文件夾內容打包成ZIP文件,需循環文件夾的全部目錄及文件
- function addFileToZip($path, $zip) {
- //打開當前文件夾$path
- $handle = opendir($path);
- //循環讀取子文件夾及文件
- //爲防止文件名自己可被轉換爲false的狀況(好比爲"0"),則需用不全等!==
- while ($file = readdir($handle) !== false) {
- //過濾假文件夾
- if ($file != '.' && $file != '..') {
- //對於子文件夾則遞歸調用本函數
- if (is_dir($path . '/' . $file)) {
- addFileToZip($path.'/'.$file, $zip);
- } else {
- //將文件添加到ZIP對象
- $zip->addFile($path . '/' . $file);
- }
- }
- }
- //關閉文件夾$path
- closedir($path);
- }
- // ----- END 解壓縮 ----- //
-
-
- /* 【文件上傳】 */
- enctype="multipart/form-data" //FORM標籤必須的屬性
- $_FILES 上傳文件信息數組變量
- error 上傳錯誤信息
- 無錯誤
- 文件大小超過php.ini配置
- 1) upload_max_filesize 容許上傳的最大文件大小
- 2) post_max_size 最大的POST數據大小
- 3) memory_limit 每一個腳本可以使用的最大內存數量(默認128MB)
- 文件大小超過瀏覽器表單配置
- MAX_FILE_SIZE 表示表單數據最大文件大小,該元素需在文件上傳域以前。(默認2M)
- <input type="hidden" name="MAX_FILE_SIZE" value="102400">
- 文件只有部分被上傳
- 文件沒有被上傳
- 6,7 臨時文件寫入時失敗
- 找不到臨時文件
- 文件寫入失敗
- name 文件名
- type 文件類型
- tmp_name 上傳文件臨時路徑
- size 文件大小
- move_uploaded_file($path, $newpath); //將上傳的文件移動到新位置
- is_uploaded_file($file) //判斷是否爲POST上傳的文件
- //多文件上傳
- <input type="file" name="updfile[]" /> //HTML中以數組提交
- $_FILES['updfile']['tmp_name'][0] //服務器端可訪問第一個文件的臨時路徑,其餘屬性相似
-
-
- //php.ini配置
- file_uploads = On 是否容許HTTP上傳文件
- upload_max_filesize 上傳文件大小限制,默認爲2M
- post_max_size post方式表單數據總大小限制,默認爲8M
- upload_tmp_dir 上傳文件臨時目錄,默認是系統臨時目錄
- 需設置上傳文件臨時目錄,給其最小權限
- GET方式的最大傳輸量爲2K
-
-
- /* 【批量提交】 */
- FORM表單中的name值可用名稱加中括號的形式,在$_POST獲取表單數據時,可多項提交造成數組。
- 好比多文件上傳file,複選框提交checkbox等。
- <input type="checkbox" name="id[]" value="值1" />
- <input type="checkbox" name="id[]" value="值2" />
- $id = $_POST['id']; //則可得到所有被選中的複選框值,造成索引數組
- 若是name值爲:
- <input type="checkbox" name="id[one]" value="值1" />
- <input type="checkbox" name="id[two]" value="值2" />
- $id = $_POST['id']; //則可獲取全部name爲id[...]的值,造成管理數組
-
-
- /* iconv */
- //php.ini配置iconv
- [iconv]
- ;iconv.input_encoding = ISO-8859-1
- ;iconv.output_encoding = ISO-8859-1
- ;iconv.internal_encoding = ISO-8859-1
- iconv_set_encoding($type, $charset);
- $type:input_encoding,output_encoding,internal_encoding
- iconv_get_encoding([$type = "all"])
- $type:all,input_encoding,output_encoding,internal_encoding
-
-
-
- iconv($in_charset, $out_charset, $str) //將字符串轉換爲目標編碼
-
- 指定編碼,可解決中文字符的統計、查詢、截取等!
- iconv_strlen($str [,$charset]) //統計字符串的字符數
- iconv_strpos($str, $needle, $offset [,$charset]) //查找子串首次出現的位置
- iconv_strrpos($str, $needle [,$charset]) //查找子串最後一次出現的位置
- iconv_substr($str, $offset [,$len [,$charset]]) //截取子串
-
-
- /* 【字符串函數】*/
- addslashes($str) //使用反斜線轉移字符串
- stripcslashes($str) //反引用一個使用addcslashes轉義的字符串
- stripslashes($str) //反引用一個引用字符串
- chr($ascii) //返回ASCII碼的字符
- ord($char) //返回字符的ASCII碼
- substr_count($haystack, $needle) //計算子串出現的次數
- count_chars($str [,$mode]) 統計每一個字節值出現的次數
- //0 - 以全部的每一個字節值做爲鍵名,出現次數做爲值的數組。
- //1 - 與0相同,但只列出出現次數大於零的字節值。
- //2 - 與0相同,但只列出出現次數等於零的字節值。
- //3 - 返回由全部使用了的字節值組成的字符串。
- //4 - 返回由全部未使用的字節值組成的字符串。
- crypt($str, [$salt]) //單向字符串散列
- str_split($str [,$len]) //將字符串按長度分割爲數組
- explode($separ, $str) //使用一個字符串分割另外一個字符串
- implode([$glue,] $arr) //將數組元素的值根據$glue鏈接成字符串
- chunk_split($str [,$len [,$end]]) //將字符串分割成小塊
- $len:每段字符串的長度,$end:每段字符串末尾加的字符串(如"\r\n")
- html_entity_decode($str [,$flags [,$encoding]]) //將HTML實體轉成字符信息
- htmlentities($str [,$flags [,$encoding]]) //將字符信息轉成HTML實體
- htmlspecialchars_decode($str) //將特殊HTML實體轉成字符信息
- htmlspecialchars($str [,$flags [,$encoding]]) //將字符信息轉成特殊HTML實體
- lcfirst($str) //將字符串首字母轉成小寫
- ucfirst($str) //將字符串首字母轉成大寫
- ucwords($str) //將字符串中每一個單詞的首字母轉換爲大寫
- strtolower($str) //將字符串轉化爲小寫
- strtoupper($str) //將字符串轉化爲大寫
- trim($str [,$charlist]) //去除字符串首尾處的空白字符(或者其餘字符)
- ltrim($str [,$charlist]) //去除字符串首段的空白字符(或者其餘字符)
- rtrim($str [,$charlist]) //去除字符串末端的空白字符(或者其餘字符)
- md5_file($file) //計算指定文件的MD5散列值
- md5($str) //計算字符串的MD5散列值
- money_format($format, $num) //將數字格式化爲貨幣形式
- number_format($num) //格式化數字
- nl2br($str) //在字符串全部新行以前插入HTML換行標記<br />
- parse_str($str, [$arr]) //解析字符串
- print($str) //輸出字符串
- printf //輸出格式化字符串
- sprintf($format [,$args...]) //格式化字符串
- sha1_file //計算文件的sha1散列值
- sha1 //計算字符串的sha1散列值
- similar_text($first, $second [,$percent]) //計算兩個字符串的類似度
- 返回在兩個字符串中匹配字符的數目,$percent存儲類似度百分比
- str_replace($search, $replace, $str [,$count [,$type]]) //子字符串替換
- str_ireplace //字符串替換(忽略大小寫)
- str_pad($str, $len [,$pad [,$type]]) //使用另外一個字符串填充字符串爲指定長度
- $type:在何處填充。STR_PAD_RIGHT,STR_PAD_LEFT 或 STR_PAD_BOTH
- str_repeat($str, $num) //重複一個字符串
- str_shuffle($str) //隨機打亂一個字符串
- str_word_count($str [,$format [,$charlist]]) //返回字符串中單詞的使用狀況
- strcasecmp($str1, $str2) //二進制安全比較字符串(不區分大小寫)
- 若是str1小於str2,返回負數;若是str1大於str2,返回正數;兩者相等則返回0。
- strcmp($str1, $str2) //二進制安全字符串比較
- strcoll($str1, $str1) //基於區域設置的字符串比較(區分大小寫,非二進制安全)
- strcspn($str1, $str1 [,$start [,$len]]) //獲取不匹配遮罩的起始子字符串的長度
- strip_tags($str) //從字符串中去除HTML和PHP標記
- strpos($haystack, $needle [,$offset]) //查找字符串首次出現的位置
- stripos($haystack, $needle [,$offset]) //查找字符串首次出現的位置(不區分大小寫)
- strripos($haystack, $needle [,$offset]) //計算指定字符串在目標字符串中最後一次出現的位置(不區分大小寫)
- strrpos($haystack, $needle [,$offset]) //計算指定字符串在目標字符串中最後一次出現的位置
- strlen($str) //獲取字符串長度
- strpbrk($haystack, $str) //在字符串中查找一組字符的任何一個字符
- strrev($str) //反轉字符串
- join('', array_reverse(preg_split("//u", $str))); //實現對UTF-8字符串的反轉
- strspn$subject, $mask) //計算字符串中所有字符都存在於指定字符集合中的第一段子串的長度。
- strstr($haystack, $needle) //查找字符串的首次出現
- stristr($haystack, $needle) //查找字符串的首次出現(不區分大小寫)
- strrchr($haystack, $needle) //查找指定字符在字符串中的最後一次出現
- strtok($str, $token) //標記分割字符串
- substr_compare($main_str, $str, $offset [,$len) //二進制安全比較字符串(從偏移位置比較指定長度)
- substr_replace$str, $replace, $start [,$len] //替換字符串的子串
- strtr($str, $from, $to) //轉換指定字符
- substr($str, $start [,$len]) //返回字符串的子串
- vfprintf$handle, $format, $args) //將格式化字符串寫入流
- vprintf($format, $args) //輸出格式化字符串
- vsprintf($format, $args) //返回格式化字符串
- wordwrap($str [,$width=75 [,$break='\n']]) //打斷字符串爲指定數量的字串
-
- crc32($str) //計算一個字符串的crc32多項式
- crc32算法[循環冗餘校驗算法]
- 生成str的32位循環冗餘校驗碼多項式。將數據轉換成整數。
-
- /* mbstring(多字節字符串) */
- //需開啓mbstring擴展
- mb_strimwidth($str, $start, $width [,$trim [,$encoding]]) //保留指定的子串(並補充)
- mb_stripos($str, $needle [,$offset [,$encoding]]) //查找子串首次出現的位置(忽略大小寫)
- mb_strpos($str, $needle [,$offset [,$encoding]]) //查找子串首次出現的位置
- mb_strripos($str, $needle [,$offset [,$encoding]]) //查找子串最後一次出現的位置(忽略大小寫)
- mb_strrpos($str, $needle [,$offset [,$encoding]]) //查找子串最後一次出現的位置
- mb_strstr($str, $needle [,$before [,$encoding]]) //返回子串首次出現位置以後(前)的字符串
- mb_stristr($str, $needle [,$before [,$encoding]]) //返回子串首次出現位置以後(前)的字符串(忽略大小寫)
- mb_strrchr($str, $needle [,$before [,$encoding]]) //返回字符最後一次出現位置以後(前)的字符串
- mb_strrichr($str, $needle [,$before [,$encoding]]) //返回字符最後一次出現位置以後(前)的字符串(忽略大小寫)
-
- mb_strtoupper($str [,$encoding]) //轉換成大寫
- mb_strtolower($str [,$encoding]) //轉換成小寫
-
- mb_strlen($str [,$encoding]) //獲取字符串長度
- mb_split($pattern, $str [,$limit]) //將字符串分割成數組
- mb_substr($str, $start [,$len [,$encoding]]) //獲取字符串的子串
- mb_strcut($str, $start [,$len [,$encoding]]) //獲取字符串的子串
- mb_strwidth($str [,$encoding]) //獲取字符串的寬度
- mb_substr_count($str, $needle [,$encoding]) //子串在字符串中出現的次數
-
-
- /* PCRE函數 */
- preg_filter($pattern, $replace, $subject [,$limit [,&$count]]) 執行一個正則表達式搜索和替換
- preg_replace($pattern, $replace, $subject [,$limit [,&$count]]) 執行一個正則表達式搜索和替換
- preg_replace_callback($pattern, $callback, $subject [,$limit [,&$count]]) 執行一個正則表達式搜索而且使用一個回調進行替換
- preg_grep($pattern, $input [,$flags]) 返回匹配模式的數組條目
- preg_match($pattern, $subject [,&$matches [,$flags [,$offset]]]) 執行一個正則表達式匹配
- preg_match_all($pattern, $subject [,&$matches [,$flags [,$offset]]]) 執行一個全局正則表達式匹配
- $matches存放返回的結果
- $matches[0][n] (n>=0) 表示存放第n+1個匹配到的結果
- $matches[m][n] (m>=1, n>=0) 表示存放第n+1個匹配到結果的第m個表達式的內容
- preg_split($pattern, $subject [,$limit [,$flags]]) 經過一個正則表達式分隔字符串
- $limit表示限制分隔獲得的子串最多隻有limit個,-1表示不限制
- $flags參數:
- PREG_SPLIT_NO_EMPTY:將返回分隔後的非空部分
- PREG_SPLIT_DELIM_CAPTURE:用於分隔的模式中的括號表達式將被捕獲並返回
- PREG_SPLIT_OFFSET_CAPTURE:對於每個出現的匹配返回時將會附加字符串偏移量
- preg_quote($str [,$delimiter]) 轉義正則表達式字符
- preg_last_error() 返回最後一個PCRE正則執行產生的錯誤代碼
-
-
- /* Math函數 */
- base_convert($number, $frombase, $tobase) //在任意進制之間轉換數字
- ceil($float) //向上取整
- floor($float) //向下取整
- exp($float) //計算e的指數
- hypot($x, $y) //計算直角三角形的斜邊長
- is_nan($val) //判斷是否爲合法數值
- log($arg [,$base=e]) //天然對數
- max($num1, $num2, ...) //找出最大值
- max($arr) //找出數組中的最大值
- min($num1, $num2, ...) //找出最小值
- rand([$min], $max) //產生一個隨機整數
- srand([$seed]) //播下隨機數發生器種子
- mt_rand([$min], $max) //生成更好的隨機數
- mt_srand($seed) //播下一個更好的隨機數發生器種子
- pi() //獲得圓周率值
- pow($base, $exp) //指數表達式
- sqrt($float) //求平方根
- deg2rad($float) //將角度轉換爲弧度
- rad2deg($float) //將弧度數轉換爲相應的角度數
- round($val [,$pre=0]) //對浮點數進行四捨五入
- fmod($x, $y) //返回除法的浮點數餘數
-
-
-
- /* 【MySQL函數】 */
- mysql_client_encoding([$link]) //返回字符集的名稱
- mysql_set_charset($charset [,$link]) //設置客戶端字符集編碼
- mysql_connect($host, $user, $pass) //打開一個到MySQL服務器的鏈接
- mysql_create_db($db [,$link]) //新建一個MySQL數據庫
- mysql_pconnect($host, $user, $pass) //打開一個到MySQL服務器的持久鏈接
- mysql_ping([$link]) //Ping一個服務器鏈接,若是沒有鏈接則從新鏈接
- mysql_close([$link]) //關閉MySQL鏈接
-
- mysql_data_seek($result, $row) //移動內部結果的指針
- mysql_errno([$link]) //返回上一個MySQL操做中的錯誤信息的數字編碼
- mysql_error([$link]) //返回上一個MySQL操做產生的文本錯誤信息
- mysql_affected_rows([$link]) //取得前一次MySQL操做所影響的記錄行數
- mysql_info([$link]) //取得最近一條查詢的信息
- mysql_insert_id([$link]) //取得上一步INSERT操做產生的ID
-
- mysql_query($sql [,$link]) //發送一條MySQL查詢
- mysql_unbuffered_query($sql [,$link]) //向MySQL發送一條SQL查詢,並不獲取和緩存結果的行
- mysql_db_query($db, $sql [,$link]) //發送一條MySQL查詢
-
- mysql_escape_string($str) //轉義一個字符串用於mysql_query
- mysql_real_escape_string($str) //轉義SQL語句中使用的字符串中的特殊字符,並考慮到鏈接的當前字符集
-
- mysql_fetch_array($result [,$type]) //從結果集中取得一行做爲關聯數組,或數字數組,或兩者兼有
- mysql_fetch_assoc($result) //從結果集中取得一行做爲關聯數組
- mysql_fetch_object($result) //從結果集中取得一行做爲對象
- mysql_fetch_row($result) //從結果集中取得一行做爲枚舉數組
- mysql_fetch_field($result) //從結果集中取得列信息並做爲對象返回
- mysql_num_fields($result) //取得結果集中字段的數目
- mysql_num_rows($result) //取得結果集中行的數目
-
- mysql_fetch_lengths($result) //取得結果集中每一個輸出的長度
- mysql_field_flags($result, $field_offset) //從結果中取得和指定字段關聯的標誌
- mysql_field_len($result, $field_offset) //返回指定字段的長度
- mysql_field_name($result, $field_offset) //取得結果中指定字段的字段名
- mysql_field_seek($result, $field_offset) //將結果集中的指針設定爲制定的字段偏移量
- mysql_field_table($result, $field_offset) //取得指定字段所在的表名
- mysql_field_type($result, $field_offset) //取得結果集中指定字段的類型
- mysql_free_result($result) //釋放結果內存
-
- mysql_list_dbs([$link]) //列出MySQL服務器中全部的數據庫
- mysql_list_fields($db, $table [,$link]) //列出MySQL結果中的字段
- mysql_list_processes([$link]) //列出MySQL進程
- mysql_list_tables($db [,$link]) //列出MySQL數據庫中的表
-
- mysql_result($result, $row [$field]) //取得結果數據
- mysql_select_db($db [,$link]) //選擇MySQL數據庫
- mysql_tablename($result, $i) //取得表名
- mysql_db_name($result, $row [,$field]) //取得mysql_list_dbs()調用所返回的數據庫名
-
- mysql_stat([$link]) //取得當前系統狀態
- mysql_thread_id([$link]) //返回當前線程的ID
- mysql_get_client_info() //取得MySQL客戶端信息
- mysql_get_host_info() //取得MySQL主機信息
- mysql_get_proto_info() //取得MySQL協議信息
- mysql_get_server_info() //取得MySQL服務器信息
-
-
- /* 【SQL注入】 */
- 特殊字符致使的問題:
- 1. 轉義:mysql_real_escape_string()
- 對外來數據(GPC: GET, POST, COOKIE)進行轉義
- 2. 先查詢當前記錄行,再匹配用戶名
-
- //魔術引號機制
- 自動爲全部提交到服務器的數據增長特殊符號的轉義。
- 當打開時,全部的單引號,雙引號,反斜線和NULL字符都會被自動加上一個反斜線進行轉義。這和addslashes()做用徹底相同。
- php.ini配置:
- magic_quotes_gpc = Off
- get_magic_quotes_gpc() 獲取當前魔術引號機制的配置信息
-
- /* 【錯誤處理】 */
- 解析錯誤、運行錯誤
- //標準錯誤:
- 級別、信息、文件、行號
- trigger_error 觸發一個用戶自定義的error/warning/notice錯誤信息
-
- //php.ini配置,ini_set()
- error_reporting 設置報告哪些級別的錯誤
- # 錯誤報告:顯示到頁面
- display_errors = On 是否顯示錯誤報告
- # 錯誤日誌:存放到文件
- log_errors = on 是否開啓錯誤日誌
- error_log 發送錯誤信息到錯誤日誌文件
- - 錯誤報告和錯誤日誌可同時啓用!
-
- 自定義錯誤處理器
- set_error_handler — 註冊自定義錯誤處理器函數
- - 自定義處理器函數包含4個參數,分別是級別、信息、文件、行號
- - 開啓自定義錯誤處理器,則系統內置的錯誤報告和錯誤日誌則不會執行。
- - 自定義錯誤處理器函數返回false,則自定義函數結束後系統內置的會繼續執行。
- - 用戶定義的錯誤級別(E_USER_ERROR),能夠被自定義的錯誤處理器所捕獲並繼續執行。系統內置的錯誤,則腳本會當即中止。
- restore_error_handler — 恢復預約義錯誤處理器函數
- error_get_last — 獲取最近的錯誤信息
-
- //錯誤處理函數
- debug_backtrace 產生一條回溯跟蹤
- 返回數組,包含的鍵值:function, line, file, class, object, type, args
- debug_print_backtrace 打印一條回溯
-
- //錯誤常量
- 手冊>錯誤處理
-
- #生產模式
- 關閉錯誤報告,記錄錯誤日誌。
- #開發模式
- 關閉錯誤日誌,開啓錯誤報告。
-
- //異常
- 面向對象語法中的錯誤處理方式。
- 一個異常就是一個包含當前異常信息的對象。
- 預約義異常類Exception及其擴展類。
- #拋出異常
- 觸發一個異常的錯誤
- throw new UserException();
- 若是沒有被捕獲,則報告致命錯誤。
- #監視異常
- try {代碼段}
- #捕獲異常
- catch (UserException $obj) {代碼段}
- 須要經過當前異常的類型匹配纔可悲捕獲。
- #異常處理器
- 用以處理未被捕獲的異常。
- 異常處理器函數與catch相似,參數也是含類型的對象。
- set_exception_handler — 註冊異常處理器函數
- restore_exception_handler — 恢復預約義的異常處理器函數
-
-
- #自定義異常
- 用戶定義的異常類須繼承自Exception類。
-
- //異常相關屬性
- protected string $message 異常消息內容
- protected int $code 異常代碼
- protected string $file 拋出異常的文件名
- protected int $line 拋出異常在該文件中的行號
- //異常相關方法
- Exception::__construct — 異常構造函數
- Exception::getMessage — 獲取異常消息內容
- Exception::getPrevious — 返回異常鏈中的前一個異常
- Exception::getCode — 獲取異常代碼
- Exception::getFile — 獲取發生異常的程序文件名稱
- Exception::getLine — 獲取發生異常的代碼在文件中的行號
- Exception::getTrace — 獲取異常追蹤信息
- Exception::getTraceAsString — 獲取字符串類型的異常追蹤信息
- Exception::__toString — 將異常對象轉換爲字符串
- Exception::__clone — 異常克隆
-
- /* 【數據庫抽象層】 */
- PDO:PHP Data Objects
- PHO抽象層默認被加載,但需加載相應數據庫的驅動。
- PDO是OOP語法,提供三個類:
- PDO:PDO自身
- PDOStatement:PDO語句類,提供對語句的後續處理
- PDOException:PDO異常類,提供對錯誤的異常處理
-
- //鏈接數據庫
- PDO::__construct(str $dsn [,str $username [,str $password [,arr $driver_options]]])
- DSN:Data Source Name,數據源
- $dsn = 'mysql:dbname=testdb;host=127.0.0.1;port=3306';
- //執行沒有返回結果的SQL語句
- int PDO::exec(str $statement) //返回影響的記錄數
- //執行有返回結果集的SQL語句
- PDOStatement PDO::query (string $statement) //返回PDOStatement對象
- //處理結果集(PDOStatement對象)
- array PDOStatement::fetchAll([int $fetch_style [,mixed $fetch_argument [,array $ctor_args = array()]]]) //默認返回關聯+索引數組
- mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] ) //返回一行
- string PDOStatement::fetchColumn ([ int $column_number = 0 ] ) //返回一列
- //釋放資源
- unset($pdo) 或 $pdo = null
-
- //錯誤報告
- 靜默模式:silent mode,出現錯誤,不主動報告錯誤(默認)
- array PDO::errorInfo(void)
- 警告模式:warning mode,出現錯誤,觸發一個警告級別的錯誤
- 異常錯誤:exception mode,出現錯誤,拋出異常
- bool PDO::setAttribute(int $attribute, mixed $value) //設置PDO類屬性值
- PDO::setAttribute('PDO::ATTR_ERRMODE', 'PDO::ERRMODE_SILENT | PDO::ERRMODE_WARNING | PDO::ERRMODE_EXCEPTION')
-
- //預處理式執行SQL
- 可對數據自動轉義,可有效抵制SQL注入。
- PDOStatement PDO::prepare(string $statement [,array $driver_options=array()])
- bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )
- bool PDOStatement::execute ([ array $input_parameters ] )
-
-
- /* 【AR模式】 */
- 表 -> 類
- 字段 -> 類屬性
- 數據 -> 對象
-
-
- /* Date/Time */
- date($format [,$timestamp]) //格式化一個本地時間/日期,$timestamp默認爲time()
- Y:4位數字完整表示的年份
- m:數字表示的月份,有前導零
- d:月份中的第幾天,有前導零的2位數字
- j:月份中的第幾天,沒有前導零
- H:小時,24小時格式,有前導零
- h:小時,12小時格式,有前導零
- i:有前導零的分鐘數
- s:秒數,有前導零
- L:是否爲閏年,若是是閏年爲1,不然爲0
- M:三個字母縮寫表示的月份,Jan到Dec
- W:年份中的第幾周,每週從星期一開始
- z:年份中的第幾天
- N:數字表示的星期中的第幾天
- w:星期中的第幾天,數字表示
- e:時區標識
- T:本機所在的時區
- U:從Unix紀元開始至今的秒數(時間戳)
- time() //返回當前的Unix時間戳(秒)
- microtime([$get_as_float]) //返回當前Unix時間戳和微秒數
- $get_as_float參數存在而且其值等價於TRUE,將返回一個浮點數
- strtotime($time [,$now]) //將任何英文文本的日期時間描述解析爲Unix時間戳
- date("Y-m-d H:i:s", strtotime("-1 day")); //格式化前一天的時間戳
- "now"
- "10 September 2000"
- "+1 week"
- "+1 week -2 days 4 hours 2 seconds"
- "last Monday"
- "next Thursday"
- gmdate($format [,$timestamp]) //格式化一個GMT/UTC 日期/時間
- mktime([$hour = date("H") [,$minute = date("i") [,$second = date("s") [,$month = date("n") [,$day = date("j") [,$year = date("Y") [,$is_dst = -1]]]]]]]) //取得一個日期的Unix時間戳
- strftime($format [,$timestamp]) //根據區域設置格式化本地時間/日期
- date_default_timezone_get($timezone) //獲取默認時區
- date_default_timezone_set($timezone) //設置默認時區
-
-
- /* DateTime */
- //date()函數能處理有效時間戳範圍是格林威治時間 1901 年 12 月 13 日 20:45:54 到 2038 年 1 月 19 日 03:14:07(由於32位系統能最大正整數限制)
- DateTime::__construct([$time="now"]) //構造方法
- $time如果時間戳,則在時間戳前加@符號,如'@2345678'
- DateTime::setTimezone($timezone) //設置時區
- eg: $date->setTimezone(new DateTimeZone('PRC'));
- DateTime::format($format) //格式化時間戳,格式化字符串形式同date()函數
-
-
- /* $_SERVER */
- //示例URL:http://desktop/dir/demo.php?a=aaa&b=bbb
- PHP_SELF 當前執行腳本的文件名 // /dir/demo.php
- GATEWAY_INTERFACE 服務器使用的CGI規範的版本 // CGI/1.1
- SERVER_ADDR 當前運行腳本所在的服務器的IP地址 // 127.0.0.1
- SERVER_NAME 當前運行腳本所在的服務器的主機名 // desktop
- SERVER_SOFTWARE 服務器標識字符串 // Apache/2.2.22 (Win32) PHP/5.3.13
- SERVER_PROTOCOL 請求頁面時通訊協議的名稱和版本 // HTTP/1.1
- REQUEST_METHOD 訪問頁面使用的請求方式 // GET
- REQUEST_TIME 請求開始時的時間戳 // 1386032633
- QUERY_STRING 查詢字符串(參數) // a=aaa&b=bbb
- DOCUMENT_ROOT 當前運行腳本所在的文檔根目錄 // C:/Users/Administrator/Desktop
- HTTP_ACCEPT 當前請求頭中Accept:項的內容 // text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- HTTP_ACCEPT_CHARSET 當前請求頭中Accept-Charset:項的內容 // UTF-8,*
- HTTP_ACCEPT_ENCODING 當前請求頭中Accept-Encoding:項的內容 // gzip, deflate
- HTTP_ACCEPT_LANGUAGE 當前請求頭中Accept-Language:項的內容 // zh-cn,zh;q=0.5
- HTTP_CONNECTION 當前請求頭中Connection:項的內容 // keep-alive
- HTTP_HOST 當前請求頭中Host:項的內容 // desktop
- HTTP_REFERER 引導用戶代理到當前頁的前一頁的地址
- HTTP_USER_AGENT 當前請求頭中User-Agent:項的內容 // Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
- HTTPS 若是腳本是經過HTTPS協議被訪問,則被設爲一個非空的值
- REMOTE_ADDR 瀏覽當前頁面的用戶的IP地址 // 127.0.0.1
- REMOTE_HOST 瀏覽當前頁面的用戶的主機名
- REMOTE_PORT 用戶機器上鍊接到Web服務器所使用的端口號 // 49197
- REMOTE_USER 經驗證的用戶
- REDIRECT_REMOTE_USER 驗證的用戶,若是請求已在內部重定向
- SCRIPT_FILENAME 當前執行腳本的絕對路徑 // C:/Users/Administrator/Desktop/dir/demo.php
- SERVER_ADMIN 該值指明瞭Apache服務器配置文件中的SERVER_ADMIN參數 //admin@shocker.com
- SERVER_PORT Web服務器使用的端口 // 80
- SERVER_SIGNATURE 包含了服務器版本和虛擬主機名的字符串
- PATH_TRANSLATED 當前腳本所在文件系統(非文檔根目錄)的基本路徑
- SCRIPT_NAME 當前腳本的路徑 // /dir/demo.php
- REQUEST_URI URI用來指定要訪問的頁面 // /dir/demo.php?a=aaa&b=bbb
- PHP_AUTH_DIGEST 客戶端發送的「Authorization」 HTTP頭內容
- PHP_AUTH_PW 用戶輸入的密碼
- AUTH_TYPE 認證的類型
- PATH_INFO 包含由客戶端提供的、跟在真實腳本名稱以後而且在查詢語句(query string)以前的路徑信息
- ORIG_PATH_INFO 在被PHP處理以前,「PATH_INFO」的原始版本
-
-
-
-
- /* 緩存 */
- 1. ob緩存(輸出緩存)(需開啓)
- php.ini設置中開啓並設置輸出緩存大小:output_buffering = 4096
- ob_start() 開啓當前腳本頁面的輸出緩存
- 若是輸出緩存打開,則輸出的數據先放到輸出緩存(header函數前能夠有輸出),不然直接放入程序緩存。
- header()函數發送的內容直接放入程序緩存。
- 開啓輸出緩存後,輸出緩存數據會刷新到程序緩存,而後有Apache封裝成http響應包返回給瀏覽器。
- 輸出緩存:存放的數據是從開啓輸出緩存開始返回給瀏覽器的全部靜態頁面數據!
- 2. 程序緩存(內部緩存,必須存在,不能關閉)
- 3. 瀏覽器緩存
-
- /* ob緩存(輸出控制) */ Output Buffering
- ob_start() //打開一個輸出緩衝區,全部的輸出信息再也不直接發送到瀏覽器,而是保存在輸出緩衝區裏面。
- ob_start('ob_gzhandler'); //將gz編碼的數據發送到支持壓縮頁面的瀏覽器
-
- ob_clean(); //刪除內部緩衝區的內容,不關閉緩衝區(不輸出)。
- ob_end_clean(); //刪除內部緩衝區的內容,關閉緩衝區(不輸出)。
- ob_get_clean(); //返回內部緩衝區的內容,關閉緩衝區。至關於執行ob_get_contents()與ob_end_clean()
- ob_flush(); //發送內部緩衝區的內容到瀏覽器,刪除緩衝區的內容,不關閉緩衝區。
- ob_end_flush(); //發送內部緩衝區的內容到瀏覽器,刪除緩衝區的內容,關閉緩衝區。
- ob_get_flush(); //返回內部緩衝區的內容,並關閉緩衝區,再釋放緩衝區的內容。至關於ob_end_flush()並返回緩衝區內容。
- flush(); //將當前爲止程序的全部輸出發送到用戶的瀏覽器
-
- ob_get_contents(); //返回緩衝區的內容,不輸出。
- ob_get_length(); //返回內部緩衝區的長度,若是緩衝區未被激活,該函數返回FALSE。
- ob_get_level(); //Return the nesting level of the output buffering mechanism.
- ob_get_status(); //獲取ob狀態信息
-
- ob_implicit_flush(); //打開或關閉絕對刷新,默認爲關閉,打開後ob_implicit_flush(true),所謂絕對刷新,即當有輸出語句(e.g: echo)被執行時,便把輸出直接發送到瀏覽器,而再也不須要調用flush()或等到腳本結束時才輸出。
-
- ob_gzhandler //ob_start回調函數,用gzip壓縮緩衝區的內容。
- ob_list_handlers //List all output handlers in use
- output_add_rewrite_var //Add URL rewriter values
- output_reset_rewrite_vars //Reset URL rewriter values
-
- 這些函數的行爲受php_ini設置的影響:
- output_buffering //該值爲ON時,將在全部腳本中使用輸出控制;若該值爲一個數字,則表明緩衝區的最大字節限制,當緩存內容達到該上限時將會自動向瀏覽器輸出當前的緩衝區裏的內容。
- output_handler //該選項可將腳本全部的輸出,重定向到一個函數。例如,將 output_handler 設置爲 mb_output_handler() 時,字符的編碼將被修改成指定的編碼。設置的任何處理函數,將自動的處理輸出緩衝。
- implicit_flush //做用同ob_implicit_flush,默認爲Off。
-
- //ob緩存做用
- 1)防止在瀏覽器有輸出以後再使用setcookie()、header()或session_start()等發送頭文件的函數形成的錯誤。其實這樣的用法少用爲好,養成良好的代碼習慣。
- 2)捕捉對一些不可獲取的函數的輸出,好比phpinfo()會輸出一大堆的HTML,可是咱們沒法用一個變量例如$info=phpinfo();來捕捉,這時候ob就管用了。
- 3)對輸出的內容進行處理,例如進行gzip壓縮,例如進行簡繁轉換,例如進行一些字符串替換。
- 4)生成靜態文件,其實就是捕捉整頁的輸出,而後存成文件。常常在生成HTML,或者整頁緩存中使用。
-
-
- /* 網站併發 */