書接上回:後端開發技術教學(四) 數據交互延伸-CSDN博客
必要資源:
trae中文版下載網址: TRAE - The Real AI Engineer
phpStudy 2018 : phpStudy - Windows 一键部署 PHP 开发环境 · 小皮出品
前言
大家好,我是小楓。上期我們把表單提交即數據上傳的全過程完整的講解了一遍。相信大家對數據交互也有一定的了解了。那麼我們這期將會介紹一下魔術方法、類、序列化這3種概念。
我們將會以這篇文章結束後端PHP篇,下一期將會是全新的系列——後端python系列。
目录
一、類與對象
類是個抽象的概念,用來描述具有相同屬性和方法的對象的集合。類只是模版,可以說對象就是類。
對象是類的實例,打個比方: 人是一個"類",而"小楓"則是具體存在的一個對象(人=小楓)。只是每個人 (類與對象) 的 身高體重 (屬性) 方面有不同,或有的人會彈琴、有的人會跳舞 (功能)
類的作用在於: 組織代碼塊,讓程序更靈活、易維護。
1.1 操作對象
在類中選對象,而對象就是類的實例化。通過對象操作:
1.) 屬性 (以變量更改數據) 2.) 方法 (以函數付予功能)
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在线评测