[Web 安全] PHP 反序列化漏洞 —— PHP 魔術方法

關注這個專欄的其他相關筆記:[Web 安全] 反序列化漏洞 - 學習筆記-CSDN博客

PHP 魔術方法 - 簡介 - PHP 魔術方法 - 簡單教程,簡單編程PHP 中,以兩個下劃線 ( `__` ) 開頭方法稱之為 「 魔術方法 」 這些 「 魔術方法 」 在 [PHP](/l/yufei/php/php-basic-index.html) 中扮演這重要的角色,作為一名 PHP 開發人員,你必須知道它們,且會用它們 本專欄,我們就來看看和學習這些魔術方法,以及一些簡單的使用范例 ## PHP 魔術方法一覽 |方法名|說明| |:---|:---| |\__construct()類的構造函數 |\__destruct()| 類 - 簡單教程,簡單編程 https://twle.cn/c/yufei/phpmmethod/phpmmethod-basic-index.html

0x01:PHP 魔術方法簡介

在 PHP 中,以兩個下劃線(__)開頭的方法就被稱為「 魔術方法 」。魔術方法是 PHP 中一個預定好的,在特定情況下會自動觸發的行為方法。 這些魔術方法在 PHP 中扮演著重要的角色,作為一名 PHP 開發人員,我們必須要掌握并且能熟練使用它們。下面,開始本章的學習,以下是常見的 PHP 魔術方法,及其作用簡介:

方法名作用解析
__construct()類的構造函數,創建對象時觸發
__destruct()類的析構函數,對象被銷毀時觸發
__call()當調用對象的一個不存在或不可訪問的方法時會自動調用
__callStatic()當調用對象或類的一個不存在或不可訪問的靜態方法時會自動調用
__get()調用不可訪問、不存在的對象成員屬性時觸發
__set()在給不可訪問、不存在的對象成員屬性賦值時觸發
__isset()當對不可訪問屬性調用 isset()empty() 時觸發
__unset()當使用?reset()?重制一個對象不存在的或不可訪問的屬性時會自動調用
__invoke()把對象當作函數調用時觸發
__sleep()執行 serialize() 函數前會先調用此方法。
__wakeup()執行 unserialize() 函數前會先調用此方法。
__toString()當把對象當成字符串調用時會觸發此方法
__clone()使用 clone 關鍵字拷貝完一個對象后觸發
__set_state()當使用 var_export() 將數組導出為變量時會自動調用
__autoload()嘗試自動加載一個未定義的類
__debugInfo()打印輸出調試信息,針對 var_dump() 函數

0x02:PHP 魔術方法 — __construct()

0x0201:方法簡介

PHP 構造函數 __construct() 是對象被創建后自動調用的第一個方法。

任何類都會有一個構造函數,當我們沒有顯示的聲明它時,系統其實已經為它創建了一個隱藏的默認的構造函數,這個默認的構造函數沒有任何參數,也不會執行任何代碼,等價于一個空函數。

一旦我們在類中顯式的聲明了一個構造函數,那么默認的構造函數就會消失,也可以說是我們創建的構造函數會覆蓋掉系統默認的構造函數。

0x0202:方法作用

構造函數通常用于執行一些初始化任務,例如在創建對象時設置成員變量的初始值。

0x0203:方法聲明

在類中聲明一個構造函數的語法格式一般如下:

?class ClassName {function __construct([parameter list]){// 函數主體,這里面通常用于初始化對象的一些屬性}}

注意:一個 PHP 類中只能有一個構造函數,因為 PHP 不允許進行函數重載!

0x0204:調用示例

下面的代碼聲明了一個 Dog 類,同時在該類中創建了一個構造函數,用于初始化對象的相應屬性:

?<?php?class Dog {public $name; // 姓名public $age; ?// 年齡?function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age; ? // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}}?$dog = new Dog("旺財", "10"); // 實例化一只小狗

如上,可以看到,我們只是實例化了 Dog 類,并沒有主動調用類中的方法,__construct() 方法就自己調用了。

0x03:PHP 魔術方法 — __destruct()

0x0301:方法簡介

__destruct() 方法會在該類的一個對象被刪除時自動調用。一般情況下,該函數的觸發時機為:

  1. 主動調用 unset($obj)

  2. 主動調用 $obj = NULL

  3. 程序自動結束。

0x0302:方法作用

__destruct() 函數通常被用于對象執行完畢后進行釋放資源的操作,比如關閉文件、關閉數據庫鏈接、清空一個結果集等。

0x0303:方法聲明

在類中聲明 __destruct() 函數的語法格式如下,該函數沒有任何參數也沒有任何返回值:

?class ClassName {function __destruct() {// 其他代碼}}

0x0304:調用示例

在下面這個例子中,我們給 Dog 類添加上析構函數 __destruct(),當對象走向消亡(生命周期結束)時,它會進行提示:

?<?php?class Dog {public $name; // 姓名public $age; ?// 年齡?function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age; ? // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}?function __destruct() {echo "=============== destruct ===============\n";echo "快樂的時光總是短暫的,你的 🐕 " . $this -> name . "還是走向了它的終點\n";echo "請不要傷心,它的故事只是已另一種形式展開。。。。。";}}?$dog = new Dog("旺財", "10"); // 實例化一只小狗

0x04:PHP 魔術方法 — __call()

0x0401:方法簡介

__call() 方法只能被用于類中,當程序嘗試調用類對象的一個 不存在 的或者 不可訪問 的方法或屬性時會被自動調用。

0x0402:方法聲明

該方法有兩個參數,第一個參數是調用的那個不存在的 方法名,第二個參數是一個數組(array),是傳遞給不存在方法的所有參數組成的數組:

?class ClassName {function __call( string $func_name, array $args) {// 內部代碼}}

0x0403:調用示例

如下,我們給 Dog 類創建了一個 __call 方法,用于在程序調用其中不存在的方法時進行自動調用:

?<?php?class Dog {public $name; // 姓名public $age; ?// 年齡?function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age; ? // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}?function __call($func_name, $args) {echo "================ Call Error ! ================\n";echo "Sorry, " . $this -> name . "不會" .$func_name . "\n";print_r($args);}}?$dog = new Dog("旺財", "1"); // 實例化一只小狗$dog -> fly("高高", $hight="100 米"); // 讓小狗飛高高,想飛 100 米那么高

0x05:PHP 魔術方法 — __callStatic()

0x0501:方法簡介

__callStatic() 會在程序調用一個不存在的靜態方法(該方法不存在或者不可訪問)時被自動調用。

0x0502:方法聲明

該方法接收兩個參數,第一個參數是調用的那個不存在的靜態方法名,第二個參數是一個數組(array),是傳遞給不存在的靜態方法的所有參數組成的數組:

?class ClassName {static function __callStatic( string $func_name, array $args) {// 內部代碼}}

0x0503:調用示例

如下,我們給 Dog 類創建了一個 __callStatic 方法,用于在程序調用其中不存在的靜態類時自動觸發:

?<?php?class Dog {public $name; // 姓名public $age; ?// 年齡?function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age; ? // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}?static function __callStatic($name, $arguments) {echo "================ Call Error ! ================\n";echo "靜態方法:" . $name . "不存在!\n";print_r($arguments);}}?$dog = new Dog("旺財", "1"); // 實例化一只小狗?// 下面就是調用靜態方法的寫法$dog::fly("高高", $hight="100 米"); // 讓小狗飛高高,想飛 100 米那么高

0x06:PHP 魔術方法 — __get()

0x0601:方法簡介

當一個類定義了一個 __get() 魔術方法后,我們就可以獲取該類的實例的私有屬性或不存在的屬性而不犯錯,這里所說的獲取,是指獲取其值。

0x0602:方法聲明

該方法的原型如下:

class ClassName {public mixed function __get( string $propertyName ) {// 內部代碼}
}

0x0603:調用示例

在下面的示例中,我們創建了一個 Dog 類,并為其添加了 __get() 魔法方法,當程序調用類中不存在的屬性時,就會提示報錯:

<?phpclass Dog {public $name; // 姓名public $age;  // 年齡function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age;   // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}public function __get($propertyName) {echo "================ Get Error ! ================\n";echo "Sorry, The Dog Class Didn't have <" . $propertyName . "> attribute\n";}
}$dog = new Dog("旺財", "1"); // 實例化一只小狗
echo $dog -> type; // 想要知道 Dog 屬于哪類

0x07:PHP 魔術方法 — __set()

0x0701:方法簡介

魔術方法 __set() 可以用來給類的實例的不存在的屬性或不可訪問的屬性賦值。

0x0702:方法聲明

該方法有兩個參數,第一個參數 $property 是不存在的或不可訪問的實例屬性,第二個參數 $value 是實際要賦的值。

該方法可以有返回值,也可以沒有返回值,這取決于開發者的要求:

class ClassName {public function __set( $propertyName, $value ) {// 內部代碼}
}

0x0703:調用示例

在如下示例中,當我們為私有屬性 age 賦值時就會觸發類中的 __set 方法,做一個簡單的判斷,不讓這個年齡過大或者過小:

<?phpclass Dog {public $name; // 姓名private $age;  // 年齡function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age;   // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}public function __set($propertyName, $value) {print_r("===================== Set =====================\n");if ($propertyName == "age") {if ($value < 0 or $value > 35) {echo "Error! Your Dog Age IS Error !!!\n"; // 當設置的年齡超過了狗年齡的范圍時觸發} else {$this -> age = $value;echo "Now, Your Dog Age is " . $this -> age . "\n";}}}
}$dog = new Dog("旺財", "1"); // 實例化一只小狗
$dog -> age = 100; // 想讓狗的年齡變成 100 歲
$dog -> age = 18;  // 想讓狗的年齡回到 18 歲

0x08:PHP 魔術方法 — __isset()

0x0801:方法簡介

在討論 __isset() 魔術方法之前,筆者先簡單介紹一下 isset() 方法,該方法主要用于判斷一個變量或一個實例的一個屬性是否被定義。

如果變量或實例的屬性不存在,或被賦值為 NULL,就會返回 false,其它情況下一律返回 true,哪怕目標被賦值為 false0''

isset() 通常用于判斷某個變量是否被設置,但它同時可以在外部實例中判斷實例的某個屬性值是否被設置,這通常有兩個常見:

  1. 如果屬性是公開(public)屬性,那么可以直接使用 isset()來判斷該屬性是否設置。

  2. 如果屬性是一個私有(private)的屬性,那么 isset() 就無法正常工作了。

針對上述的第二種情況,我們就需要用到 __isset() 方法了。

0x0802:方法作用

通過在類中定義 __isset() 魔術方法,我們就可以使用 isset() 來判斷這個類的實例的某個私有屬性是否被 “設置”(只要 __isset() 返回 true,那么 isset() 方法就會返回 true,反之亦然)。

0x0803:方法聲明

該方法只接收一個參數,就是要進行判斷的屬性名,該方法的返回值為一個 Bool 類型:

class ClassName {public bool function __isset( $propertyName ) {// 內部代碼return [true or false];}
}

0x0804:調用示例

在下面的代碼中,類中的 age 屬性為私有的,要想判斷實例的 age 屬性是否被設置,我們就要借助 __isset() 方法:

<?phpclass Dog {public $name; // 姓名private $age;  // 年齡function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age;   // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}public function __isset($property) {print_r("WUHU, {$property} is a private attribute, __isset function is auto runs!!!\n");return isset($this -> $property);}
}$dog = new Dog("旺財", "1"); // 實例化一只小狗
var_dump(isset($dog -> age));

0x09:PHP 魔術方法 — __unset()

0x0901:方法簡介

如果一個類中定義了魔術方法 __unset(),那么我們就可以使用 unset() 函數來銷毀類的私有屬性,或在銷毀一個不存在的屬性時得到通知。

然而實際上到底有沒有銷毀那個屬性,取決于 __unset() 的具體實現,假如我們定義了一個空的 __unset() 方法,emmmm,沒人這么閑吧。

0x0902:方法聲明

該方法的原型如下:

class ClassName {public function __unset( $propertyName ) {// 內部代碼}
}

0x0903:調用示例

在下面的示例中,我們在 Dog 類中定義了一個 __unset() 方法,并用它嘗試銷毀類中的一個私有屬性,與一個不存在的屬性:

<?phpclass Dog {public $name; // 姓名private $age;  // 年齡function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age;   // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}public function __unset( $property ) {if ($property != "age") {echo "啊哦, 你銷毀的東東不存在 !!!!\n";} else {echo "<$property> 已成功被銷毀 !!!\n";unset($this -> $property);}}
}$dog = new Dog("旺財", "1"); // 實例化一只小狗
unset($dog -> type); // 嘗試銷毀不存在的 Type 屬性
unset($dog -> age);  // 嘗試銷毀類的私有屬性 age

0x10:PHP 魔術方法 — __sleep()

0x1001:方法簡介

當我們在 PHP 中調用 serialize() 函數嘗試序列化一個實例時,會首先檢查該實例中是否存在 __sleep() 方法,如果該方法存在,則自動調用,否則使用默認的序列化方式。

0x1003:方法聲明

我們可以在 __sleep() 方法中定制類的實例的序列化輸出結果,并剔除一些不需要被序列化的屬性,比如那些保存了超大數據的屬性。

該魔術方法沒有任何參數,單必須要有返回值,返回值的類型是 Array 類的,它包含了想要序列化的該實例的屬性名:

class ClassName {public array function __sleep() {// 內部代碼return array();}
}

0x1004:調用示例

比如下面這個例子,我們創建了一個 Dog 類,當程序序列化該類對象時,我們剔除了 $age 屬性,并對 $name 屬性進行了編碼操作:

<?phpclass Dog {public $name; // 姓名private $age;  // 年齡function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age;   // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}function __sleep() {print_r("============= Dog 類正在序列化 Ing =============");$this -> name = base64_encode($this -> name);$this -> type = "Dog"; // 臨時創建一個屬性return array("name", "type"); // 返回的時候排除了 $age 屬性}
}$dog = new Dog("旺財", "1"); // 實例化一只小狗
echo serialize($dog); // 對 dog 進行序列化

0x11:PHP 魔術方法 — __wakeup()

0x1101:方法簡介

當我們在 PHP 中使用 unserialize() 反序列化一個對象時,如果類中存在 __wakeup() 方法,那么該方法就會被自動調用。

0x1102:方法聲明

該魔術方法既沒有參數,也沒有返回值:

class ClassName {public function __wakeup() {// 內部代碼}
}

0x1103:調用示例

下面示例中,我們往 Dog 類中添加了反序列化方法,用來在反序列化時,對 $name 進行 Base64 解碼:

<?phpclass Dog {public $name; // 姓名private $age;  // 年齡function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age;   // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}function __sleep() {print_r("============= Dog 類正在序列化 Ing =============");$this -> name = base64_encode($this -> name);$this -> type = "Dog"; // 臨時創建一個屬性return array("name", "type"); // 返回的時候排除了 $age 屬性}function __wakeup() {print_r("============= Dog 類正在反序列化 Ing =============");$this -> name = base64_decode($this -> name); // 對 Dog 名稱進行 Base64 解碼}
}$dog = new Dog("旺財", "1"); // 實例化一只小狗$serialize_dog = serialize($dog); // 對 dog 進行序列化
echo $serialize_dog . "\n";$new_dog = unserialize($serialize_dog);
echo "\nDog 的名稱: " . $new_dog -> name;

0x12:PHP 魔術方法 — __toString()

0x1201:方法簡介

當我們使用 echo 語句嘗試輸出一個對象時,就會自動檢查一個對象有沒有定義 __toString() 方法,如果定義了,就會輸出 __toString() 方法的返回值,如果沒有定義,那么就會直接拋出一個異常,表明該對象不能直接轉換為字符串。

0x1202:方法聲明

該方法沒有任何參數,也不會傳遞任何參數,但該方法必須有一個返回值,且返回值必須為字符串類型:

class ClassName {public string function __toString() {// 內部代碼}
}

0x1203:調用示例

在下面例子中,我們為 Dog 類新增添了一個 __toString() 方法,并通過 echo 輸出了該類:

<?phpclass Dog {public $name; // 姓名private $age;  // 年齡function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age;   // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}public function __toString() {return sprintf("Dog('%s', '%s')", $this -> name, $this -> age);}
}$dog = new Dog("旺財", "1"); // 實例化一只小狗
echo $dog;

0x13:PHP 魔術方法 — __invoke()

0x1301:方法簡介

當我們嘗試將一個對象當作一個方法來使用時就會自動調用它的 __invoke() 方法,如果目標對象中不包含該方法,就會直接報錯。

0x1302:方法聲明

該方法可以有返回值,也可以沒有,對于返回值的類型,它也沒有任何限制:

class ClassName {public mixed function __invoke() {// 內部代碼}
}

0x1303:調用示例

下面的代碼,我們給 Dog 類加上了 __invoke() 魔術方法,然后我們就可以將它的實例當作普通方法來調用了:

<?phpclass Dog {public $name; // 姓名private $age;  // 年齡function __construct($name, $age) {echo "恭喜你,你成功創建了一只 🐕 !!!\n";$this -> name = $name; // 初始化 Dog 的名稱echo "Dog Name : " . $this -> name . "\n";$this -> age = $age;   // 初始化 Dog 的年齡echo "Dog Age  : " . $this -> age . "\n";}function __invoke() {echo "Hello, My Name is " . $this -> name . " I am " .$this ->age . "Years Old Now !!!";}
}$dog = new Dog("旺財", "1"); // 實例化一只小狗
$dog(); // 把 dog 對象當作方法調用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72460.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡為ext4格式

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡為ext4格式 2025/3/4 16:47 緣起&#xff1a;128GB的TF卡&#xff0c;只能格式化為NTFS/exFAT/ext4。 在飛凌的OK3588-C下&#xff0c;NTFS格式只讀。 exFAT需要改內核來支持。 現在只剩下ext4了。 linux R4默認不支持exFAT…

跨域問題解釋及前后端解決方案(SpringBoot)

一、問題引出 有時,控制臺出現如下問題。 二、為什么會有跨域 2.1瀏覽器同源策略 瀏覽器的同源策略 &#xff08; Same-origin policy &#xff09;是一種重要的安全機制&#xff0c;用于限制一個源&#xff08; origin &#xff09;的文檔或 腳本如何與另一個源的資源進行…

【NLP 30、文本匹配任務 —— 傳統機器學習算法】

目錄 一、文本匹配任務的定義 1.狹義解釋 2.廣義解釋 二、文本匹配的應用 1.問答對話 2.信息檢索 3.文本匹配任務應用 三、智能問答 1.智能問答的基本思路 依照基礎資源劃分&#xff1a; 依照答案產出方式劃分 依照NLP相關技術劃分 四、智能問答的價值 1.智能客服 2.Faq知識庫問…

開源表單、投票、測評平臺部署教程

填鴨表單聯合寶塔面板深度定制,自寶塔面板 9.2 版本開始,在寶塔面板-軟件商店中可以一鍵部署填鴨表單系統。 簡單操作即可擁有屬于自己的表單問卷系統,快速賦能業務。即使小白用戶也能輕松上手。 社區版體驗地址:https://demo.tduckapp.com/home 前端項目地址: tduck-fro…

Elasticsearch 限制索引大小與索引模板匹配沖突解決方案

文章目錄 背景介紹環境限制索引大小創建 ILM&#xff08;索引生命周期管理&#xff09;策略創建 ILM 策略 創建索引模板并關聯 ILM 策略使用索引模板應用 ILM 策略 解決索引模板匹配沖突? 解決方案&#x1f539; 方案 1&#xff1a;修改 index_patterns&#xff08;推薦&#…

[LeetCode]day33 150.逆波蘭式求表達值 + 239.滑動窗口最大值

逆波蘭式求表達值 題目鏈接 題目描述 給你一個字符串數組 tokens &#xff0c;表示一個根據 逆波蘭表示法 表示的算術表達式。 請你計算該表達式。返回一個表示表達式值的整數。 注意&#xff1a; 有效的算符為 ‘’、‘-’、‘*’ 和 ‘/’ 。 每個操作數&#xff08;運…

論文閱讀筆記:UniFace: Unified Cross-Entropy Loss for Deep Face Recognition

論文閱讀筆記&#xff1a;UniFace: Unified Cross-Entropy Loss for Deep Face Recognition 1 背景2 創新點3 方法3.1 回顧softmax損失3.2 統一交叉熵損失3.3 人臉驗證中的UCE損失3.4 進一步的優化3.4.1 邊際UCE損失3.4.2 平衡BCE損失 4 實驗4.1 消融實驗4.2 和SOTA方法對比 論…

Metal學習筆記七:片元函數

知道如何通過將頂點數據發送到 vertex 函數來渲染三角形、線條和點是一項非常巧妙的技能 — 尤其是因為您能夠使用簡單的單行片段函數為形狀著色。但是&#xff0c;片段著色器能夠執行更多操作。 ? 打開網站 https://shadertoy.com&#xff0c;在那里您會發現大量令人眼花繚亂…

騰訊云 | 微搭低代碼快速開發數據表單應用

如上所示&#xff0c;登錄騰訊云微搭低代碼業務控制臺&#xff0c;開始新創建一個應用&#xff0c;創建應用的方式包括&#xff0c;根據實際的業務需求&#xff0c;從模版列表中選擇一個模板填入數據模型創建新應用&#xff0c;使用微搭組件自主設計數據模型創建新應用&#xf…

儲油自動化革命,網關PROFINET與MODBUS網橋的無縫融合,錦上添花

儲油行業作為能源供應鏈的關鍵環節&#xff0c;其自動化和監控系統的可靠性和效率至關重要。隨著工業4.0的推進&#xff0c;儲油設施越來越多地采用先進的自動化技術以提高安全性、降低成本并優化運營。本案例探討了如何通過使用穩聯技術PROFINET轉MODBUS模塊網關網橋&#xff…

【前端】JavaScript 備忘清單(超級詳細!)

文章目錄 入門介紹打印調試斷點調試數字let 關鍵字const 關鍵字變量字符串算術運算符注釋賦值運算符字符串插值字符串數字Math全局函數 JavaScript 條件操作符邏輯運算符 &&比較運算符邏輯運算符空值合并運算符 ?? if Statement (if 語句)Ternary Operator (三元運算…

Linux cat 命令

cat&#xff08;英文全拼&#xff1a;concatenate&#xff09;命令用于連接文件并打印到標準輸出設備上&#xff0c;它的主要作用是用于查看和連接文件。 使用權限 所有使用者 語法格式 cat [選項] [文件] 參數說明&#xff1a; -n&#xff1a;顯示行號&#xff0c;會在輸…

PARETO PROMPT OPTIMIZATION

題目 帕累托提示優化 論文地址&#xff1a;https://openreview.net/forum?idHGCk5aaSvE 摘要 自然語言迅速優化或及時工程已成為一種強大的技術&#xff0c;可以解鎖大型語言模型&#xff08;LLMS&#xff09;的各種任務的潛力。盡管現有方法主要集中于最大化LLM輸出的單一特…

前端面試題---.onChange() 事件與焦點機制解析

.onChange() 事件與焦點的總結 焦點&#xff08;focus&#xff09; 指的是 當前正在操作的元素&#xff08;如輸入框、按鈕&#xff09;。只有一個元素能同時擁有焦點。 原生 HTML 事件&#xff1a; onchange &#xff08;需要失去焦點才觸發&#xff09; 用戶輸入后&#x…

Nest系列:從環境變量到工程化實踐-2

文章目錄 [toc]一、環境搭建與基礎配置1.1 安裝驗證&#xff08;新增完整示例&#xff09;1.2 多環境配置示例 二、模塊化配置實戰2.1 根模塊高級配置2.2 數據庫模塊專用配置 三、配置獲取最佳實踐3.1 類型安全獲取示例3.2 枚舉工程化示例 四、高級場景示例4.1 動態配置熱更新4…

3.對象生活的地方—Java環境搭建

1、你要養魚&#xff0c;總得先有一個魚塘吧。挖一個魚塘來養魚&#xff0c;你需要去做下面這些事情&#xff1a; 規劃和設計&#xff1a;確定魚塘的位置、大小和形狀&#xff0c;繪制設計圖。標記和測量&#xff1a;使用測量工具標記魚塘的邊界和深度。挖掘&#xff1a;使用挖…

玩轉大模型——Trae AI IDE國內版使用教程

文章目錄 Trae AI IDE完備的 IDE 功能強大的 AI 助手 安裝 Trae 并完成初始設置管理項目什么是 “工作空間”&#xff1f;創建項目 管理插件安裝插件從 Trae 的插件市場安裝從 VS Code 的插件市場安裝 禁用插件卸載插件插件常見問題暫不支持安裝 VS Code 插件市場中某個版本的插…

數據結構1-4 隊列

一、隊列是什么&#xff1f; 先舉一個日常例子&#xff0c;排隊買飯。 排隊買飯 大家按先來后到的順序&#xff0c;在窗口前排隊買飯&#xff0c;先到先得&#xff0c;買完之后走開&#xff0c;輪到下一位買&#xff0c;新來的人排在隊尾&#xff0c;不能插隊。 可見&#x…

(十 四)趣學設計模式 之 策略模式!

目錄 一、 啥是策略模式&#xff1f;二、 為什么要用策略模式&#xff1f;三、 策略模式的實現方式四、 策略模式的優缺點五、 策略模式的應用場景六、 總結 &#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&#xff0c;可以多多支…

探秘基帶算法:從原理到5G時代的通信變革【三】Turbo 編解碼

文章目錄 2.2 Turbo 編解碼2.2.1 基本概念與系統構成2.2.2 編碼過程分步解析交織器遞歸系統卷積編碼器復接器總結 2.2.3 譯碼算法分類與原理Turbo碼的強大主要來源于其解碼器理論基礎解碼過程詳解交織與解交織譯碼算法總結 2.2.4 Turbo碼的應用場景無線通信衛星通信深空通信 2.…