亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

PHP|開發(fā)必知的良好實(shí)踐

bingo / 1555人閱讀

摘要:使用類來管理日期和時(shí)間使用類來構(gòu)造長(zhǎng)度固定的時(shí)間段。時(shí)區(qū)的處理選擇。預(yù)處理語句時(shí)的實(shí)例。簡(jiǎn)單而言,流是具有流式行為的資源對(duì)象。流的作用實(shí)際上是在出發(fā)地和目的地之間傳輸數(shù)據(jù)。錯(cuò)誤由于某種原因?qū)е聼o法運(yùn)行,通常會(huì)觸發(fā)錯(cuò)誤。

過濾、驗(yàn)證、轉(zhuǎn)義

所有這些外部資源都不能完全相信

$_GET

$_POST

$_REQUEST

$_COOKIE

$argv

php://stdin

php://input

file_get_contents()

遠(yuǎn)程數(shù)據(jù)庫

遠(yuǎn)程API

客戶端的數(shù)據(jù)

過濾

使用htmlentities()過濾HTML,將特殊字符轉(zhuǎn)換為HTML實(shí)體,轉(zhuǎn)義輸出,第二個(gè)參數(shù)使用ENT_QUOTES

使用PDO預(yù)處理語句過濾SQL注入.

使用filter_var() & filter_input()函數(shù)來過濾和驗(yàn)證不同類型的輸入。

Eg: email, number, char, 特殊字符

密碼

最安全的哈希算法:bcrypt

使用:

password_hash()
password_get_info()
password_needs_rehash()
password_verify()

函數(shù)來生成密碼。

日期,時(shí)間,時(shí)區(qū)

使用PHP5.2.0引入的DateTime & DateInterval & DateTimeZone類來處理時(shí)間。

設(shè)置默認(rèn)時(shí)區(qū)

在php.ini中,設(shè)置

date.timezone = "country/city"

使用date_default_timezone_set()函數(shù)來設(shè)置默認(rèn)時(shí)區(qū)。

DateTime Class

使用DateTime類來管理日期和時(shí)間

$datetime = new DateTime();

使用DateInterval類來構(gòu)造長(zhǎng)度固定的時(shí)間段。配合上一個(gè)類中的方法使用。

DateTimeZone Class

時(shí)區(qū)的處理選擇。

$timezone = new DateTimeZone("Asia/Shanghai");

$datetime = new DateTime("2016-05-20", $timezone);

$datetime->setTimezone(new DateTimeZone("Asia/Hong_Kong"));

有時(shí),我們需要迭代處理一段時(shí)間內(nèi)反復(fù)出現(xiàn)的一系列日期和時(shí)間,重復(fù)在日程表中記事就是個(gè)好例子。DatePeriod類可以解決這種問題

DatePeriod實(shí)例就是迭代器,每次迭代會(huì)產(chǎn)出一個(gè)DateTime實(shí)例。

format("Y-m-d H:i:s"), PHP_EOL;
}
DB PDO擴(kuò)展

http://php.net/manual/zh/pdo.drivers.php


預(yù)處理語句

為了防止SQL注入,使用PDO的預(yù)處理語句。

預(yù)處理語句時(shí)PDOStatement的實(shí)例??梢酝ㄟ^PDO實(shí)例的prepare()方法獲取與處理語句對(duì)象。

$sql = "select id from users where email = :email";
$statement = $pdo->prepare($sql);

$email = filter_input(INPUT_GET, "email");
$statement->bindValue(":email", $email);

http://php.net/manual/pdo.constants.php

繼續(xù):

$statement->execute();

while (($result = $statement->fetch(PDO::FETCH_ASSOC)) !== false) {
    echo $result["email"];
}

$results = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $result) {
    echo $result["email"];
}
PDO的事務(wù)
try {
    $pdo = new PDO();
}catch(PDOExcetion $e){
    //
}

$stmtSubtract = $pdo->prepare("
    UPDATE accounts
    SET amount = amount - :amount
    WHERE name = :name
");
$stmtAdd = $pdo->prepare("
    UPDATE accounts
    SET amount = amount + :amount
    WHERE name = :name
");

$pdo->beginTransaction();

$fromAccount = "Checking";
$withdrawal = 50;
$stmtSubtract->bindParam(":name", $fromAccount);
$stmtSubtract->bindParam(":amount", $withDrawal, PDO::PARAM_INT);
$stmtSubtract->execute();

$toAccount = "Savings";
$deposit = 50;
$stmtSubtract->bindParam(":name", $$toAccount);
$stmtSubtract->bindParam(":amount", $deposit, PDO::PARAM_INT);
$stmtSubtract->execute();

$pdo->commit();
多字節(jié)字符串

PHP假設(shè)字符串中的每個(gè)自負(fù)都是八位字符,占一個(gè)字節(jié)的內(nèi)存。然而考慮到國(guó)家化的時(shí)候,一個(gè)字符就不只占用一個(gè)字節(jié)了。

為了避免處理多字節(jié)字符串出錯(cuò),可以安裝mbstring擴(kuò)展。替換PHP原生的函數(shù)。

關(guān)于字符編碼

一定要知道數(shù)據(jù)的字符編碼

使用UTF8存儲(chǔ)數(shù)據(jù)

使用UTF8輸出數(shù)據(jù)

php.ini中設(shè)置,告訴PHP使用UTF8:

default_charset = "UTF-8";

很多PHP函數(shù)都使用這個(gè)默認(rèn)的字符集:

htmlentities()
html_entity_decode()
htmlspecialchars()
以及mbstring中的擴(kuò)展函數(shù)

流在PHP4.3.0中引入,作用是使用統(tǒng)一的方式處理文件,網(wǎng)絡(luò)和數(shù)據(jù)壓縮等共用同一套函數(shù)和用法的操作。簡(jiǎn)單而言,流是具有流式行為的資源對(duì)象。因此,流可以線性讀寫,或許還能使用fseek()函數(shù)定位到流中的任何位置。

流的作用實(shí)際上是在出發(fā)地和目的地之間傳輸數(shù)據(jù)。出發(fā)地和目的地可以是

文件,命令行進(jìn)程,網(wǎng)絡(luò)連接,zip, TAR壓縮, 臨時(shí)內(nèi)存,標(biāo)準(zhǔn)輸入輸出,或者是通過php流封裝協(xié)議實(shí)現(xiàn)的資源(http://php.net/manual/wrappers.php)

流封裝協(xié)議

http://php.net/manual/wrappers.php

流封裝協(xié)議的作用是使用通用的接口封裝讀寫文件系統(tǒng)的差異。

每個(gè)流都有一個(gè)協(xié)議和目標(biāo)

://
file:// 流封裝協(xié)議

file_get_contents

fopen

fwrite

fclose


php://流封裝協(xié)議

php://stdin

php://stdout

php://memory

php://temp

自己編寫流封裝協(xié)議

PHP提供了一個(gè)示例streamWrapper類,編寫自定義的流封裝協(xié)議。

http://php.net/manual/class.streamwrapper.php

http://php.net/manual/stream.streamwrapper.example-1.php

流上下文

有些PHP流能接受一系列可選的參數(shù),這些參數(shù)叫流上下文,用于定制流的行為。

使用

stream_context_create()

函數(shù)創(chuàng)建。

 [
        "method" => "POST",
        "header" => "",
        "content" => $requestBody,
    ],
]);

$response = file_get_contents("http://x/xapi", false, $context);
流過濾器

把過濾器附加到現(xiàn)有的流上,使用

stream_filter_append()

還可以使用php://filter流協(xié)議把過濾器附加到流上。

$handle = fopen("php://filter/read=string.toupper/resource=data.txt", "rb");
while () {

}
filter/read=/resource=://

我們還可以使用php_user_filter類來自定義流過濾器

http://php.net/manual/en/class.php-user-filter.php

class DirtyWordsFilter extends php_user_filter
{
    public function filter($in, $out, &$consumed, $closing)
    {
        $words = ["grime", "dirt", "grease"];
        $wordData = [];
        foreach ($words as $word) {
            $replacement = array_fill(0, mb_strlen($word), "*");
            $wordData[$word] = implode("", $replacement);
        }
        
        $bad = array_keys($wordData);
        $good = array_values($wordData);
        
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = str_replace($bad, $good, $bucket->data);
            
            $consumed += $bucket->datalen;
            
            stream_bucket_append($out, $bucket);
        }
        
        return PSFS_PASS_ON;
    }
}

然后,我們使用stream_filter_register()函數(shù)注冊(cè)這個(gè)自定義的流過濾器

stream_filter_register("dirty_words_filter", "DirtyWordsFilter");
異常處理示例
try {
    //
} catch (PDOException $e) {

} catch (Exception $e) {
    // 捕獲除了PDOException之外的所有異常
} finally {
    // 最終執(zhí)行
}
異常處理程序

PHP允許我們注冊(cè)一個(gè)全局異常處理程序,捕獲所有未被捕獲的異常。

set_exception_handler(function (Exception $e) {
    //
});

在某些情況下,代碼執(zhí)行完畢后,還需要還原成前一個(gè)異常處理程序。

restore_exception_handler()

錯(cuò)誤

PHP由于某種原因?qū)е聼o法運(yùn)行,通常會(huì)觸發(fā)錯(cuò)誤。

我們可以使用

trigger_error()

自己觸發(fā)錯(cuò)誤。

我們可以使用

error_reporting()

或者php.ini中使用error_reporting指令,告訴PHP如何處理錯(cuò)誤。

一定要遵守下述四個(gè)原則

一定要讓PHP報(bào)告錯(cuò)誤

在開發(fā)環(huán)境中顯示錯(cuò)誤

在生產(chǎn)環(huán)境中不能顯示錯(cuò)誤

都要記錄錯(cuò)誤

php.ini中:

//Dev
display_startup_errors = On
display_errors = On

error_reporting = -1
log_errors = On

//Prod
display_startup_errors = Off
display_errors = Off

error_reporting = E_ALL & ~E_NOTICE
log_errors = On

錯(cuò)誤處理的函數(shù)

set_error_handler(function ($error, $errstr, $errfile, $errline) {
    // Process error
})

我們也可以把PHP的錯(cuò)誤轉(zhuǎn)換為異常

只能轉(zhuǎn)換滿足php.ini中error_reporting指令設(shè)置的錯(cuò)誤

set_error_handler(function ($errno, $errstr, $errfile, $errline) {
    if (!(error_reporting() & $errno)) {
        return
    }
    
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
});

參考

Modern PHP

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/21646.html

相關(guān)文章

  • 前端工程師知的性能優(yōu)化技巧

    摘要:網(wǎng)站性能類似于二八定律,其中的優(yōu)化將帶來網(wǎng)站的性能提升。代碼重用最大的性能缺陷之一是文件大小過大和不必要的瀏覽器呈現(xiàn)。最大程度上減少文件大小的快速方法就是盡可能多地重用樣式。此外,圖像可能被壓縮,刪除任何不必要的注釋和顏色配置文件。 性能與組織 當(dāng)能夠扎實(shí)的理解并編寫HTML和CSS這門專業(yè)知識(shí)。隨著網(wǎng)站代碼量和流量的增長(zhǎng),另一種新技能也開始發(fā)揮作用,這對(duì)于開發(fā)效率和用戶體驗(yàn)都至關(guān)重要...

    crelaber 評(píng)論0 收藏0
  • 前端工程師知的性能優(yōu)化技巧

    摘要:網(wǎng)站性能類似于二八定律,其中的優(yōu)化將帶來網(wǎng)站的性能提升。代碼重用最大的性能缺陷之一是文件大小過大和不必要的瀏覽器呈現(xiàn)。最大程度上減少文件大小的快速方法就是盡可能多地重用樣式。此外,圖像可能被壓縮,刪除任何不必要的注釋和顏色配置文件。 性能與組織 當(dāng)能夠扎實(shí)的理解并編寫HTML和CSS這門專業(yè)知識(shí)。隨著網(wǎng)站代碼量和流量的增長(zhǎng),另一種新技能也開始發(fā)揮作用,這對(duì)于開發(fā)效率和用戶體驗(yàn)都至關(guān)重要...

    DTeam 評(píng)論0 收藏0
  • 從零開始建網(wǎng)站,新手小白建站知的十大忠告

    摘要:對(duì)于從零開始建網(wǎng)站的新手,知道下面十大忠告,可以少走彎路,早日走上康莊大道。阿里云自助建站平臺(tái)支持快速備案建一個(gè)手機(jī)網(wǎng)站手機(jī)網(wǎng)站具有讓消費(fèi)者隨時(shí)隨地隨身訪問的優(yōu)勢(shì)和方便快捷的不可取代的特點(diǎn)。對(duì)于從零開始建網(wǎng)站的新手,知道下面十大忠告,可以少走彎路,早日走上康莊大道。 1、一定要做網(wǎng)站規(guī)劃方案   一個(gè)網(wǎng)站的成功與否與建站前的網(wǎng)站規(guī)劃有著極為重要的關(guān)系。在建立網(wǎng)站前應(yīng)明確建設(shè)網(wǎng)站的目的,確定網(wǎng)...

    0x584a 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<