php高級進階系列文章--第二篇(PHP基礎知識復習)
php基礎知識復習
本文中對於簡單的知識點只會提及一下(例如什麽控制結構什麽的),對於較有難度的詳細復習下(例如面向對象的反射等等)
再次申明,本系列文章不是從最基礎的開始復習,對於零基礎的可能不適用,本文的初衷是我要準備攻讀源碼,在攻讀前將之前的知識牢固下,太過簡單的就寫在文中了
1,echo print echo 可以輸出一個或者多個字符串 print 只可以輸出一個字符串,返回值總為1
2,PHP7中的組合比較符
echo 1 <==> 1 // 0 echo 1 <==> 2 // -1 echo 2 <==> 1 // 1組合比較符實例
3,運算符的優先級口訣:括(號)、單(操作數)、算(術)、移(位)、關(系);位(運算符)、邏(輯)、條(件)、賦(值)、逗(號)。
--------------------7大數據類型,8個魔術變量,9大全局變量-----------------------------------------
5,數據類型 字符串,整形,浮點型,布爾值,對象,數組,空值NuLL
6,超全局變量 $_GET $_POST $_ENV $_COOKIE $_SESSION $GLOBALS $_SERVER $_REQUEST $_FILES 9大全局變量
7,魔術變量
__LINE__ 文件中的當前行號
__FILE__ 文件的完整路徑和文件名
__DIR__ 文件所在的目錄等同於dirname(__FILE__)
__FUNCTION__ 返回該函數被定義時起的名字,區分大小寫
__CLASS__ 返回該類定義時起的名字 __CLASS__ 對 trait 也起作用。當用在 trait 方法中時,__CLASS__ 是調用 trait 方法的類的名字。
__TRAIT__ 實現了代碼的復用, 從基類繼承的成員被插入的 Trait 中的 方法所覆蓋。其行為 類中定義的方法一致。優先順序是當前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法。
__METHOD__ 返回該方法被定義時的名字
__NAMESPACE__ 當前命名空間的名稱
8,在聲明命名空間之前唯一合法的代碼是用於定義源文件編碼方式的 declare 語句。所有非 PHP 代碼包括空白符都不能出現在命名空間的聲明之前
9,htmlspecialchars() 將用戶提交來的內容進行轉義 htmlspecialchars_decode()將html實體轉換為html內容
10,php 下拉框多選菜單提交時 <select multiple="multiple" name="q[]"> 這樣寫,可以將option中的內容使用數組q傳遞過來
11,使用PHP stripslashes()函數去除用戶輸入數據中的反斜杠 (\)
12,date() 函數,格式化時間戳,註意熟悉其中的參數,結合strtotime() 靈活使用其中參數,可以很簡單處理各個維度的時間戳,在項目中也回遇到
13,feof() 檢測文件是否已經讀到末尾 fgets() 用於從文件中逐行讀取文件 fgetc() 用於文件中逐字符讀取文件
14,<form action="upload_file.php" method="post" enctype="multipart/form-data"> <form> 標簽的 enctype 屬性規定了在提交表單時要使用哪種內容類型。在表單需要二進制數據時,比如文件內容,請使用 "multipart/form-data"
15,自定義錯誤處理 function custoError($errno, $errstr) 其中可以傳遞5個參數,但必須能夠處理兩個參數,錯誤級別和錯誤消息
設置錯誤程序,當發生錯誤的時候自動調用 ser_error_handler("custoError", E_USER_WARNING)
觸發錯誤 tigger_error("xxxxx", E_USER_WARNING)
16,在默認的情況下,根據在 php.ini 中的 error_log 配置,PHP 向服務器的記錄系統或文件發送錯誤記錄。通過使用 error_log() 函數,可以向指定的文件或遠程目的地發送錯誤記錄。
17, exception 錯誤異常處理
<?php // 創建一個有異常處理的函數 function checkNum($number) { if($number>1) { throw new Exception("變量值必須小於等於 1"); } return true; } // 在 try 塊 觸發異常 try { checkNum(2); // 如果拋出異常,以下文本不會輸出 echo ‘如果輸出該內容,說明 $number 變量‘; } // 捕獲異常 catch(Exception $e) { echo ‘Message: ‘ .$e->getMessage(); } ?>示例
18,自定義錯誤異常類,該類必須繼承自Execption類,可以在其中增加自定義的方法
<?php class customException extends Exception { public function errorMessage() { // 錯誤信息 $errorMsg = ‘錯誤行號 ‘.$this->getLine().‘ in ‘.$this->getFile() .‘: <b>‘.$this->getMessage().‘</b> 不是一個合法的 E-Mail 地址‘; return $errorMsg; } } $email = "[email protected]..com"; try { // 檢測郵箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是個不合法的郵箱地址,拋出異常 throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); }自定義異常類示例
19,一個腳本中可以拋出多個異常,捕獲多個異常,異常可以使用不同的異常類,返回各自的異常信息
<?php class customException extends Exception { public function errorMessage() { // 錯誤信息 $errorMsg = ‘錯誤行號 ‘.$this->getLine().‘ in ‘.$this->getFile() .‘: <b>‘.$this->getMessage().‘</b> 不是一個合法的 E-Mail 地址‘; return $errorMsg; } } $email = "[email protected]"; try { // 檢測郵箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是個不合法的郵箱地址,拋出異常 throw new customException($email); } // 檢測 "example" 是否在郵箱地址中 if(strpos($email, "example") !== FALSE) { throw new Exception("$email 是 example 郵箱"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); }多個異常
20,在實際使用中,有時候需要既對異常進行記錄,同時也要給用戶一個較好的體驗,可是使用重新拋出異常的方式,多次處理
<?php class customException extends Exception { public function errorMessage() { // 錯誤信息 $errorMsg = $this->getMessage().‘ 不是一個合法的 E-Mail 地址。‘; return $errorMsg; } } $email = "[email protected]"; try { try { // 檢測 "example" 是否在郵箱地址中 if(strpos($email, "example") !== FALSE) { // 如果是個不合法的郵箱地址,拋出異常 throw new Exception($email); } } catch(Exception $e) { // 重新拋出異常 throw new customException($email); } } catch (customException $e) { // 顯示自定義信息 echo $e->errorMessage(); }重新拋出異常示例
21,設置頂層異常處理器,此可以捕獲所有未捕獲過的異常 set_exception_handler()
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler(‘myException‘); throw new Exception(‘Uncaught Exception occurred‘); ?>設置頂層錯誤異常處理示例
22,過濾器,用於對外部用數據的過濾,增加安全性能
filter_var() 通過一個指定的過濾器來過濾單一的變量
filter_var_array() 通過相同的或不同的過濾器來過濾多個變量
filter_input() 獲取一個輸入變量,並對他進行過濾
filter_input_array() 獲取多個輸入變量,並通過相同的或不同的過濾器對他們進行過濾
<?php $int = 123; if(!filter_var($int, FILTER_VALIDATE_INT)) { echo("不是一個合法的整數"); } else { echo("是個合法的整數"); }過濾器使用簡單示例
23,有兩種過濾器 validating 和Sanitizing
validating過濾器:
用於驗證用戶輸入,嚴格的格式規則(比如URL或者email驗證),若成功返回預期的類型,若失敗返回False
Sanitizing過濾器:
用於允許或禁止字符串中指定的字符,無數據格式規則,始終返回字符串
24,php7.0 17個新特性
1>, PHP標量類型與返回值類型聲明
強制模式(默認)
嚴格模式
聲明語法格式 declare(strict_types = 1) 可用類型有 int,float,bool,string,interface,array,callable
<?php // 強制模式 function sum(int ...$ints) { return array_sum($ints); } print(sum(2, ‘3‘, 4.1));強制模式實例
<?php // 嚴格模式 declare(strict_types=1); function sum(int ...$ints) { return array_sum($ints); } print(sum(2, ‘3‘, 4.1));嚴格模式實例
嚴格模式中會對類型檢查,否則報錯
返回類型聲明同上,但是語法有區別 eg: function returnIntValue(int $value): int {....}
<?php declare(strict_types=1); function returnIntValue(int $value): int { return $value; } print(returnIntValue(5));返回類型嚴格聲明實例
2>, NULL合並運算符??,用於執行isset()檢測的三元運算的快捷方式
原先寫三元運算符時 $site = isset($_GET[‘site‘]) ? $_GET[‘SITE‘] : ‘XXXX‘
使用合並運算符後可以改為 $site = $_GET[‘site‘] ?? ‘xxx‘
3>, 太空船運算符 <=> 比較兩個表達式,返回0,1,-1
4>,php5.6 中僅可以使用const定義常量數組,在php7中可以使用define() 定義常量數組
<?php // 使用 define 函數來定義數組 define(‘sites‘, [ ‘Google‘, ‘Runoob‘, ‘Taobao‘ ]); print(sites[1]);define常量數組定義實例
5>, 通過new class 來實例化一個匿名類,代替一些"用後即焚"的完整類定義
6>,closure::call() 將一個閉包函數動態綁定到一個新的對象實例並調用執行此函數
7>,php 過濾unserialize()
8>, IntChar()
9>, CSPRNG 偽隨機數產生器 通過引入幾個CSPRNG函數提供一種簡單的機制來生成密碼學上強壯的隨機數
random_bytes() 加密生成被保護的偽隨機字符串
random_int()加密生成被保護的偽隨機整數
10>,PHP 7 異常用於向下兼容及增強舊的assert()函數。它能在生產環境中實現零成本的斷言,並且提供拋出自定義異常及錯誤的能力。
11>, PHP 7 可以使用一個 use 從同一個 namespace 中導入類、函數和常量
<? // PHP 7 之前版本需要使用多次 use use some\namespace\ClassA; use some\namespace\ClassB; use some\namespace\ClassC as C; use function some\namespace\fn_a; use function some\namespace\fn_b; use function some\namespace\fn_c; use const some\namespace\ConstA; use const some\namespace\ConstB; use const some\namespace\ConstC; // PHP 7+ 之後版本可以使用一個 use 導入同一個 namespace 的類 use some\namespace\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC};use 使用實例
12>,PHP 7 改變了大多數錯誤的報告方式。不同於 PHP 5 的傳統錯誤報告機制,現在大多數錯誤被作為 Error 異常拋出。
Error 異常層次結構: Error: ArithmeticError, AssertionError, DivisionByZeroError, ParseError, TypeError
<?php class MathOperations { protected $n = 10; // 求余數運算,除數為 0,拋出異常 public function doOperation(): string { try { $value = $this->n % 0; return $value; } catch (DivisionByZeroError $e) { return $e->getMessage(); } } } $mathOperationsObj = new MathOperations(); print($mathOperationsObj->doOperation());PHP7錯誤處理實例
13>, intdiv() 函數 接收兩個參數,返回值為第一個參數除於第二個參數的值並取整。
14>, PHP 7 session_start()函數可以接收一個數組作為參數,可以覆蓋php.ini中session的配置項
15>,廢棄了php4中的類名方法名相同時的做為構造函數使用的方法, 廢棄了使用靜態的方式調用非靜態的方法, password_hash() 其中的鹽不需要開發者提供,廢棄了 "capture_session_meta" SSL 上下文選項。 在流資源上活動的加密相關的元數據可以通過 stream_get_meta_data() 的返回值訪問。
16>,移除以下擴展 ereg, mssql, mysql, sybase_ct
17>, 移除一部分sapi
php 基礎知識暫時復習到這兒,以後學習中隨時補充
php高級進階系列文章--第二篇(PHP基礎知識復習)