欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文帶你吃透什么是PHP中的序列化

 更新時間:2023年04月28日 09:10:33   作者:金刀大菜牙  
在?PHP?中,序列化是將數(shù)據(jù)結(jié)構(gòu)或?qū)ο筠D(zhuǎn)換為可以存儲或傳輸?shù)淖址硎镜倪^程。本文將通過一些簡單的示例為大家介紹一下PHP序列化的相關(guān)知識,需要的可以參考一下

1. php 中的序列化

在 PHP 中,序列化是將數(shù)據(jù)結(jié)構(gòu)或?qū)ο筠D(zhuǎn)換為可以存儲或傳輸?shù)淖址硎镜倪^程,經(jīng)過序列化之后的對象或者數(shù)據(jù)結(jié)構(gòu),就可以保存到數(shù)據(jù)庫、緩存或通過網(wǎng)絡(luò)連接發(fā)送它,然后后面從序列化字符串重新創(chuàng)建對象或數(shù)據(jù)結(jié)構(gòu)。

以下是如何在 PHP 中序列化對象的例子:

class User
{
    public $name;
    public $email;
?
    public function __construct($name, $email)
    {
        $this->name = $name;
        $this->email = $email;
    }
}
?
$user = new User('John', 'john@example.com');
?
$serializedUser = serialize($user);
?
echo $serializedUser;

此代碼的輸出將是$user對象的字符串表示形式,類似于:

O:4:"User":2:{s:4:"name";s:4:"John";s:5:"email";s:17:"john@example.com";}

PHP 中的序列化格式相當簡單。序列化字符串由一系列數(shù)據(jù)類型和值組成,每個數(shù)據(jù)類型和值由冒號分隔。例如,整數(shù)的序列化字符串為i:123,而字符串的序列化字符串為s:5:"Hello"

要將此字符串反序列化回其原始形式,可以使用以下unserialize()函數(shù):

$unserializedUser = unserialize($serializedUser);
?
echo $unserializedUser->name; // John
echo $unserializedUser->email; // john@example.com

2. 序列化和反序列化過程中的鉤子

PHP 中有兩個鉤子可用于與此過程進行交互。你可以在一個類中定義這些鉤子函數(shù),它會在你序列化或者反序列化對象的時候自動調(diào)用。這對于在序列化或取反列化對象時執(zhí)行自定義操作很有用,例如記錄或驗證。

__sleep() 鉤子:這個鉤子在序列化時被調(diào)用。在對象的屬性被序列化之前,它允許開發(fā)人員指定哪些屬性應(yīng)該被序列化,哪些屬性不被序列化。

class MyClass 
{
    private $data;
    private $secret;
?
    public function __sleep() {
        return ['data'];
    }
}

__wakeup() 鉤子:這個鉤子在反序列化時被調(diào)用。在對象的屬性被反序列化之后,它允許開發(fā)人員在對象被反序列化后對其執(zhí)行任何必要的初始化或設(shè)置。

class MyClass 
{
    private $data;
    private $secret;
?
    public function __wakeup() {
        $this->secret = '123456';
    }
}

3. 如何使用序列化與外部服務(wù)通信

要使用序列化與外部服務(wù)通信,可以使用 PHP 的內(nèi)置函數(shù)來發(fā)送 HTTP 請求,例如file_get_contents()curl_exec(),然后你可以將序列化數(shù)據(jù)作為請求中的參數(shù)傳遞,外部服務(wù)可以在其端反序列化數(shù)據(jù)以訪問信息。

下面是使用序列化將數(shù)據(jù)發(fā)送到外部服務(wù)的示例:

$data = [
    "name" => "John", 
    "age" => 30
];
?
// Serialize the data
$serializedData = serialize($data);
?
// Send the serialized data to the external service using HTTP POST
$ch = curl_init("http://example.com/service");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "data=" . $serializedData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
?
// Handle the response from the service
echo $response;

在外部服務(wù)上,您可以使用該unserialize()函數(shù)將序列化數(shù)據(jù)轉(zhuǎn)換回 PHP 數(shù)據(jù)結(jié)構(gòu)或?qū)ο蟆?/p>

// Get the serialized data from the HTTP POST request
$serializedData = $_POST['data'];
?
// Unserialize the data
$data = unserialize($serializedData);
?
// Use the data
echo "Name: " . $data['name'] . "\n";
echo "Age: " . $data['age'] . "\n";

4. 序列化實例 - Laravel Queue

當 Laravel 將 Job 類存儲到隊列服務(wù)(可以是 Redis、AWS SQS 或類似的服務(wù))中時,對象被序列化。當你在 Laravel 中創(chuàng)建一個新的 Job 類時,它附帶了 SerializesModels 特性。

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
?
class ExampleJob implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;
    use SerializesModels;
?
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
?
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //
    }
}

如果你的作業(yè)類包含對 Eloquent 模型的引用,這個特性允許你自定義序列化過程。它包含上面看到的鉤子的實現(xiàn):

namespace Illuminate\Queue;
?
trait SerializesModels
{
    use SerializesAndRestoresModelIdentifiers;
?
    /**
     * Prepare the instance for serialization.
     *
     * @return array
     */
    public function __sleep()
    {
        // ...
    }
?
    /**
     * Restore the model after serialization.
     *
     * @return void
     */
    public function __wakeup()
    {
        // ...
    }
?
    /**
     * Prepare the instance values for serialization.
     *
     * @return array
     */
    public function __serialize()
    {
        // ...
    }
?
    /**
     * Restore the model after serialization.
     *
     * @param  array  $values
     * @return void
     */
    public function __unserialize(array $values)
    {
        // ...
    }
}

Laravel 文檔中所述:

如果你的排隊作業(yè)在其構(gòu)造函數(shù)中接受 Eloquent 模型,則只有模型的標識符將被序列化到隊列中。當實際處理作業(yè)時,隊列系統(tǒng)將自動從數(shù)據(jù)庫中重新檢索完整的模型實例及其加載的關(guān)系。這種模型序列化方法允許將更小的作業(yè)有效負載發(fā)送到您的隊列驅(qū)動程序。

5. 最后

serialize()并且unserialize() 是 PHP 的默認序列化技術(shù)。事實上,其他編程語言中有許多庫允許你根據(jù) PHP 標準序列化對象和數(shù)據(jù)結(jié)構(gòu),例如 Java 中的這個庫:

github.com/marcospassos/java-php-serializer

除了這種特定格式,您還可以使用 JSON 標準將數(shù)據(jù)傳輸?shù)酵獠糠?wù)。PHP 通過兩個函數(shù)支持這種序列化:json_encodejson_decode。

到此這篇關(guān)于一文帶你吃透什么是PHP中的序列化的文章就介紹到這了,更多相關(guān)PHP序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • php 讀取輸出其他文件的實現(xiàn)方法

    php 讀取輸出其他文件的實現(xiàn)方法

    下面小編就為大家?guī)硪黄猵hp 讀取輸出其他文件的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • 主流PHP框架的優(yōu)缺點對比分析

    主流PHP框架的優(yōu)缺點對比分析

    這篇文章主要介紹了幾款今年比較熱門的主流PHP框架的優(yōu)缺點對比分析,非常的簡單實用,有需要的小伙伴參考下。
    2014-12-12
  • ThinkPHP3.1新特性之Action參數(shù)綁定

    ThinkPHP3.1新特性之Action參數(shù)綁定

    ThinkPHP3.1版的Action參數(shù)綁定功能提供了URL變量和操作方法的參數(shù)綁定支持,這一功能可以使得你的操作方法定義和參數(shù)獲取更加清晰,也便于跨模塊調(diào)用操作方法,需要的朋友可以參考下
    2014-06-06
  • 基于php(Thinkphp)+jquery 實現(xiàn)ajax多選反選不選刪除數(shù)據(jù)功能

    基于php(Thinkphp)+jquery 實現(xiàn)ajax多選反選不選刪除數(shù)據(jù)功能

    這篇文章主要介紹了基于php(Thinkphp)+jquery 實現(xiàn)ajax多選反選不選刪除數(shù)據(jù)功能的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • ThinkPHP5郵件發(fā)送服務(wù)封裝(可發(fā)附件)

    ThinkPHP5郵件發(fā)送服務(wù)封裝(可發(fā)附件)

    這篇文章主要介紹了ThinkPHP5封裝郵件發(fā)送服務(wù),可發(fā)附件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • PHP示例演示發(fā)送郵件給某個郵箱

    PHP示例演示發(fā)送郵件給某個郵箱

    文中通過示例代碼介紹了php表單提交并發(fā)送郵件給某個郵箱,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • PHP Laravel 上傳圖片、文件等類封裝

    PHP Laravel 上傳圖片、文件等類封裝

    這篇文章主要介紹了PHP Laravel 上傳圖片、文件等類封裝的實現(xiàn)代碼,需要的朋友可以參考下
    2017-08-08
  • 利用PHP如何寫APP接口詳解

    利用PHP如何寫APP接口詳解

    很多朋友在開發(fā)時遇到過這樣的問題:后臺什么時候提供接口?怎么才提供一個接口,其他接口什么時候給出來?沒有接口我們前端怎么能做得了?那學(xué)完本篇就可以自己搞個接口來返回固定的死數(shù)據(jù)來測試了!
    2016-08-08
  • php 廣告點擊統(tǒng)計代碼(php+mysql)

    php 廣告點擊統(tǒng)計代碼(php+mysql)

    本文講的是php 廣告點擊統(tǒng)計代碼, php 廣告點擊統(tǒng)計代碼,昨天晚上有幾個IDC網(wǎng)想與本站合作放些廣告,但是我想看看廣告效果后想了就寫了一個簡單的廣告統(tǒng)計代碼了,這里只是等的統(tǒng)計不能IP限制或是惡心點擊等等了
    2018-02-02
  • Laravel中9個不經(jīng)常用的小技巧匯總

    Laravel中9個不經(jīng)常用的小技巧匯總

    這篇文章主要給大家總結(jié)介紹了關(guān)于Laravel中9個不經(jīng)常用的小技巧,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評論