当前位置: 首页 > news >正文

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

書接上回:後端開發技術教學(四) 數據交互延伸-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在线评测

http://www.dtcms.com/a/326906.html

相关文章:

  • SVG交融效果
  • Fluent Bit 日志合并正则表达式(下)
  • 【Flowable】核心概念、核心表字段、关联关系以及生命周期
  • python3.10.6+flask+sqlite开发一个越南留学中国网站的流程与文件组织结构说明
  • GM3568JHF快速入门教程【二】FPGA+ARM异构开发板环境编译教程
  • 嵌入式硬件——ARM
  • Apache虚拟主机三种配置实战
  • 为什么灰度图用G(绿色)通道?
  • Gradient Descent for Logistic Regression|逻辑回归梯度下降
  • 物理服务器内存容量选择:大数据分析场景下的适配指南
  • 互连的带宽
  • 终端安全检测和防御技术
  • 2-1〔O҉S҉C҉P҉ ◈ 研记〕❘ 漏洞扫描▸理论基础与NSE脚本
  • Flutter path_provider的基本使用(读写文件)
  • Android12 Framework电话功能UI定制
  • Mac M1探索AnythingLLM+Ollama+知识库问答
  • Vue.js 样式绑定
  • 【Node.js从 0 到 1:入门实战与项目驱动】2.1 安装 Node.js 与 npm(Windows/macOS/Linux 系统的安装步骤)
  • 派聪明RAG知识库----关于elasticsearch报错,重置密码的解决方案
  • node.js简介
  • 【论文阅读】RestorerID: Towards Tuning-Free Face Restoration with ID Preservation
  • ARM芯片架构之CoreSight SoC-400 组件介绍
  • 高效解耦:自定义内核链表实现指南(简化版)
  • LLM智能:从语言模型到通用智能体的技术跃迁
  • Java多线程基础总结
  • Python类装饰器:优雅解决描述符属性命名难题
  • 内存作假常见方案可行性分析
  • 【15-多类别分类和多标签分类】
  • SSE流式输出分层与解耦、用户自动结束语错误处理
  • 基于FPGA的热电偶测温数据采集系统,替代NI的产品(一)FPGA 测温研究现状