後端開發技術教學(五) 魔術方法、類、序列化

发布于:2025-08-13 ⋅ 阅读:(15) ⋅ 点赞:(0)

書接上回:後端開發技術教學(四) 數據交互延伸-CSDN博客

必要資源:

trae中文版下載網址: TRAE - The Real AI Engineer

phpStudy 2018 : phpStudy - Windows 一键部署 PHP 开发环境 · 小皮出品


前言

        大家好,我是小楓。上期我們把表單提交即數據上傳的全過程完整的講解了一遍。相信大家對數據交互也有一定的了解了。那麼我們這期將會介紹一下魔術方法、類、序列化這3種概念。

        我們將會以這篇文章結束後端PHP篇,下一期將會是全新的系列——後端python系列。


目录

前言

一、類與對象

1.1 操作對象

1.2 創建對象

1.3 基本框架

二、序列與反序列化

2.1  serialize()  序列化

2.2  unserialize()  反序列化

三、魔術方法

3.1  __construct()    構造方法

3.2  __destruct()  析構方法

3.3  __sleep()方法

3.4  __wakeup()方法

四、小結


一、類與對象

        類是個抽象的概念,用來描述具有相同屬性和方法的對象的集合。類只是模版,可以說對象就是類

        對象是類的實例,打個比方: 人是一個"類",而"小楓"則是具體存在的一個對象(人=小楓)。只是每個人 (類與對象) 的 身高體重 (屬性) 方面有不同,或有的人會彈琴、有的人會跳舞 (功能)

        類的作用在於: 組織代碼塊,讓程序更靈活、易維護。

        1.1 操作對象

在類中選對象,而對象就是類的實例化。通過對象操作:

1.) 屬性 (以變量更改數據)   2.) 方法 (以函數付予功能)

JS與PHP的對象語法
                         JS                           PHP
               對象名.屬性名                  對象名->屬性名
               對象名.方法名                  對象名->方法名
$us->name;	       //訪問$us(對象)的name(屬性)
$this->height;     //訪問$this(當前類的對象)的name(屬性)
$fong->say();      //執行$fong(對象)中的say()函數(功能)

        1.2 創建對象

//類的實例化=創建一個對象
$fong=new <類名>("xiaofong");	 //在類裡創建一個名為xiaofong的對象
$fong=new user("xiaofong");	     //在user(類)裡創建一個名為xiaofong的對象

::$this = 默認為當前類的對象
::即如果user(類)裡以"xiaofong"為對象,$this=$fong(即xiaofong)

        1.3 基本框架

        類中的屬性和功能都分為2種,1種是所有人都可以訪問或使用的 ; 第二種是類內部命令才可以操作的。

class user{	    //創建名為user的類​	

​	::屬性	(數據)    以變量為屬性附上數據(可留空)

​	public $name="xiaofong";	//public=公共的,在任何地方都可以訪問到該變量
​	protected $height=180;	    //protected=受保護的,只能在類的內部和子類中訪問到該變量
​	private $weight=150;	    //private=私有的,只能在類的內部能訪問到該變量
    private $IQ;    //可只寫變量,不寫數據

##private & protected = 在class(類) *裡面* 以對象語法引用,且要用$this(自己)為對象才可訪問到。


​	::方法	(功能)    以函數為對象附上功能

​	public function say(){	    //公用的函數
​		echo $this->weight;	    //$this = 對象為自己。對象不是自己會報錯
                                //在class{}外面使用echo $weight是不會輸出180的,因為權限不足。
​	}
}

$fong=new user();    //創建對象$fong以替代user(類)
echo $fong->name;
::輸出:xiaofong

二、序列與反序列化

        序列化類的操作只會作用於對象屬性(變量),不會作用於功能(函數)

        2.1  serialize()  序列化

變量中複雜的數組或對象拆分成字符串,以便數據存儲到數據庫中或傳遞到其他地方。

class user{
    public $name="xiaolin";
    public $age=18;
    private $money=1000;
}

$fong=new user("xiaolin");
var_dump (serialize($fong));
::將user(類)拆成字符串  

        

A="拆解的數據"        以B="變量"

A的類型 : A的長度 : A的內容 A中的 變量/數組 數量 : { B的類型 : B的長度 : B的內容 ; 值的類型 : 值的長度 : 值的內容 ; (下一組變量也是一樣)

**private / protected的變量排列方法則與public的不一樣  (上面的是public的排列方法)

                        數據標識                       代表的類型
                             O                           對象
                             a                           數組

                             s

                         字符串
                             i                           數字
                             b                     bool (true/false)
                             N                          空對象

        2.2  unserialize()  反序列化

        就是序列化的相反——將字符串變回複雜的數組或對象,如從數據庫或其他地方取出對象。原本是甚麼樣的,反序列化後就長甚麼樣。

echo (unserialize("O:4:"user":3:{s:4:"name";s:7:"xiaolin";s:3:"age";i:18;s:11:" user money";i:1000;}"));
::輸出:
class user{
    public $name="xiaolin";
    public $age=18;
    private $money=1000;
}

三、魔術方法

        魔術方法類似於已定義的函數,但其不像函數一樣需要顯式調用,而是在特定的情況下會自動被調用。以2個下劃線(__)開頭,後面寫方法名稱[__construct() __destruct() 等等]。

        3.1  __construct()    構造方法

        當創建新對象(new)時,該方法會自動被調用用於初始化對象的狀態或執行其他必要的操作。類似 if、elseif等條件指令,只不過if、elseif的運行條件是條件為真,而__construct()的運行條件是當創建新對象而已。

//構造方法
class user{	
    public $name="xiaofong";

    public function __construct($name){	    //當對象被實例化(創建)時,自動執行
​	    echo "構造方法被執行了";      //不只執行這個,初始化的過程沒有顯示
​	    echo $this->name=$name:	    //指向當前對象的name屬性,並把$name附給對象的name屬性
}

::當對象被new創建之後,__construct()命令會被自動執行,將$name(xiaofong)附給新對象的name屬性

new user("fong");
::輸出:構造方法被執行了xiaofong    //new完自動執行,不用調用


        3.2  __destruct()  析構方法

        跟__construct()差不多。當對象被銷毀時自動執行,以釋放資源。

class user{	
    public function __destruct(){	//當對象被銷毀時自動執行
​	    echo "析構方法被執行了";     //不只執行這個,釋放資源的過程沒有顯示
        }
}
del user("fong");
::輸出:析構方法被執行了    //對象被刪除後自動執行

        3.3  __sleep()方法

        當對象被序列化( serialize() )時自動被調用。用於指定哪些數據需要被序列化 (敏感數據),哪些不用(普通數據) ; 或者切斷與數據庫的連接。

        通過__sleep()方法,我們確保只有指定屬性被序列化,而別的屬性則被排除在外。這對於管理臨時資源或敏感信息時特別有用。

//用以返回我們要反序列化的東西,即序列化的結果
class user{
    private $password;
    public $name="xiaofong";

    public function __sleep(){	    
​	    echo "當外部使用serialize()時會調用這裡的__sleep方法\n";

​    	return array('password');	 //必須返回一個數值,不然會報錯。
        ::裡面的元素表示要序列化的變量(除此之外,其他變量一律不執行序列化)
    }
    
    $this->password=1234567890
}
​						
$fong=new user("xiaofong");
serialize($fong);
::輸出:O:4:"user":1:{s:8:"password";i:10:1234567890;}   //只序列化$password,而不序列化$name

        3.4  __wakeup()方法

        與__sleep()方法相反,在對象被反序列化時自動調用。此方法可重新建立數據庫連接,或執行其他初始化操作。

        用法與__sleep()差不多,同理可證也。

四、小結

        上面序列化與反序列化相關的技術,會涉及到CTF漏洞利用哈,這個以後會教給大家,所以大家一定一定要掌握好哈。

         而其他的,大家只需要記住它們的功能和運作邏輯就可以了,實操可以讓AI幫忙寫代碼,具體的之前已經說過了,這裡就不多說了。接下來我們會開始研究後端python、數據庫mysql以及分析漏洞哈。大家敬請期待了。


Trae AI寫代碼:後端開發技術教學(一) [附2025最新可用 phpstudy2018下載鏈接] -CSDN博客

CTF漏洞訓練埸:BUUCTF在线评测


网站公告

今日签到

点亮在社区的每一天
去签到