1. 程式人生 > >php高級進階系列文章--第二篇(PHP基礎知識復習)

php高級進階系列文章--第二篇(PHP基礎知識復習)

new val 大小寫 包括 所在 復習 part option ogl

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基礎知識復習)