【PHP】新版本特性記錄(持續更新)

文章目錄

  • 前言
  • PHP 7.0
    • 1)NULL合并運算符:??
    • 2)參數、返回值支持類型聲明
    • 3)太空船操作符:<=>
    • 4)通過 define 定義常量數組
    • 5)匿名類實例化
    • 6)字符串里使用\u轉義unicode codepoint
  • PHP 7.1
    • 1)數組解構賦值
    • 2)可為空(Nullable)類型
    • 3)新增void返回值類型
    • 4)類常量可見性
    • 5)多異常捕獲處理
  • PHP 7.2
    • 1)新增object類型
    • 2)Sodium成為核心擴展
  • PHP 7.3
    • 1)數組解構支持引用賦值
  • PHP 7.4
    • 1)箭頭函數
    • 2)NULL合并賦值運算符:??=
    • 3)類屬性支持類型聲明
    • 4)在數組中使用Spread運算符
  • PHP 8.0
    • 1)match表達式
    • 2)Nullsafe運算符
    • 3)命名參數
    • 4)聯合類型聲明
    • 5)新增mixed類型
    • 6)對象可以通過::class獲取類名
    • 7)構造器屬性提升
    • 8)注解
  • PHP 8.1
    • 1)枚舉類型
    • 2)Spread運算符支持展開關聯數組
    • 3)新增never返回值類型
    • 4)readonly屬性
    • 5)交集類型聲明
    • 6)可以使用final來修飾類常量
    • 7)使用new初始化參數
  • PHP 8.2
    • 1)新增true/false/null類型
    • 過時:動態屬性

前言

本文用于記錄PHP各個版本的新特性,僅記錄個人認為比較重要的特性,如果需要全面的信息,請查閱官方文檔。

PHP 7.0

官方文檔

1)NULL合并運算符:??

NULL合并運算符(Null coalescing operator)是個語法糖,用于簡化三元表達式和isset()的寫法。如果變量存在且值不為 NULL,就會返回自身的值,否則返回第二個操作數。

// php7前
$uid = isset($_GET['uid']) ? $_GET['uid'] : 0;// 使用NULL合并運算符
$uid = $_GET['uid'] ?? 0;// 鏈式使用,如果沒有a則獲取b,如果沒有b則返回默認值0
$uid = $_GET['a'] ?? $_GET['b'] ?? 0;

2)參數、返回值支持類型聲明

類型聲明可以用于函數的參數、返回值, PHP 7.4.0 起還可以用于類的屬性, PHP 8.3.0 起還可以用于類的常量。

function foo(string $str): string
{return $str . 'hello';
}

如果參數類型和實際傳的不一致,在可以轉換的前提下,PHP會自動進行一個隱式的轉換,如果不可以轉換,則會拋出一個 TypeError 錯誤。例如:

function foo(string $a): void
{var_dump($a); // 輸出:string(3) "123"
}foo(123); // 傳入int,會自動轉換為string
foo([1]); // 數組無法轉換為string,報錯

如果不希望自動轉換,可以開啟嚴格模式。在嚴格模式下,只能接受完全匹配的類型,否則會拋出 TypeError錯誤,唯一的例外是 int 值也可以傳入聲明為 float 的類型

declare(strict_types=1); // 開啟嚴格模式function foo(string $a): void
{var_dump($a);
}foo(123); // 會直接報錯

3)太空船操作符:<=>

太空船操作符(Spaceship operator)用于比較兩個值的大小,如果相等返回0,如果左值小于右值返回-1,如果左值大于右值返回1

echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

4)通過 define 定義常量數組

define('ANIMALS', ['dog','cat','bird'
]);

5)匿名類實例化

interface Logger
{public function save();
}$app->setLogger(new class implements Logger {public function save(){// TODO: Implement save() method.}}
);

6)字符串里使用\u轉義unicode codepoint

// 漢字“嚴”的unicode codepoint是4e25(十六進制)
echo "\u{4e25}" . PHP_EOL; // 輸出:嚴

PHP 7.1

官方文檔

1)數組解構賦值

數組解構(Array destructuring)是一種便捷的方式,用于將數組中的元素賦值給變量,這在處理數組或從函數返回多個值時特別有用。在PHP中,可以使用[]語法進行解構。

關聯數組:

$data = ['name'   => 'tim','gender' => 'male','age'    => 18,
];
// 解構賦值
['name' => $name, 'age' => $age] = $data;var_dump($name, $age); // 輸出:tim, 18

索引數組:

$data = ['A', 'B', 'C'];[$a, $b] = $data; // 獲取索引為0和1的元素[$arr[], $arr[]] = $data; // 將索引0和1的元素放入到$arr數組[, , $c] = $data; // 如果不提供變量名,則忽略對應位置的元素[2 => $c] = $data; // 獲取索引為2的元素

在循環中使用解構:

$data = [['id' => 1, 'name' => 'tim'],['id' => 2, 'name' => 'john'],
];foreach ($data as ['name' => $name]) {var_dump($name);
}

2)可為空(Nullable)類型

參數以及返回值的類型現在可以通過在類型前加上一個問號使之允許為null

// $str參數要么為字符串,要么為null
function foo(?string $str): ?string
{
}

3)新增void返回值類型

返回值類型為void的,不能返回任何數據,包括null

function foo(): void
{return; // 合法return null; // 不合法
}

試圖去獲取一個 void 方法的返回值會得到 null ,并且不會產生任何警告。

4)類常量可見性

可以為類中的常量設置可見性:

class ConstDemo
{const PUBLIC_CONST_A = 1; // 默認為publicpublic const PUBLIC_CONST_B = 2;protected const PROTECTED_CONST = 3;private const PRIVATE_CONST = 4;
}

5)多異常捕獲處理

一個catch語句塊現在可以通過管道字符(|)來實現多個異常的捕獲。 這對于需要同時處理來自不同類的不同異常時很有用。

try {// some code
} catch (FirstException | SecondException $e) {// handle first and second exceptions
}

PHP 7.2

官方文檔

1)新增object類型

function foo(object $obj): object
{
}

2)Sodium成為核心擴展

現代 Sodium 加密類已經成為 PHP 核心擴展。

PHP 7.3

官方文檔

1)數組解構支持引用賦值

$arr = ['tim'  => ['uid' => 1],'john' => ['uid' => 2],
];['tim' => &$tim] = $arr;
$tim['uid'] = 3; // 此處的修改會影響到$arr
var_dump($arr);

PHP 7.4

官方文檔

1)箭頭函數

箭頭函數是一種更簡潔的匿名函數寫法,語法是fn(參數) => 表達式,例如:

$y = 1;
// 普通匿名函數寫法
$fn1 = function($x) use ($y) {return $x + $y;
};
// 箭頭函數寫法
$fn2 = fn($x) => $x + $y;var_dump($fn1(2), $fn2(2)); // 打印結果都是3

可見,箭頭函數會自動引入外部變量$y,無需使用use關鍵字,更加方便。

但是,如果想要在函數內部修改外部變量的話,只能用匿名函數

$y = 1;
// 普通匿名函數寫法
$fn1 = function() use (&$y) {$y++;
};
// 箭頭函數寫法
$fn2 = fn() => $y++;$fn2();
var_dump($y); // 輸出仍然是1,沒有變化$fn1();
var_dump($y); // 輸出2

箭頭函數的限制:

  • =>后面只能跟一個表達式,不能包含多條語句
  • 不能修改父作用域變量

2)NULL合并賦值運算符:??=

NULL合并賦值運算符(Null coalescing assignment operator)(??=)是對NULL合并運算符(??)的一個升級:

$_GET['uid'] ??= 0; // 寫法比以下兩種寫法都要簡潔得多
var_dump($_GET['uid']); // 輸出:0// 等同于寫法1
$_GET['uid'] = isset($_GET['uid']) ? $_GET['uid'] : 0;// 等同于寫法2
$_GET['uid'] = $_GET['uid'] ?? 0;

3)類屬性支持類型聲明

類中的屬性支持聲明類型(callable除外):

class User
{public int $uid;public string $name;public static int $age;
}

4)在數組中使用Spread運算符

Spread運算符(...)用于將一個數組展開,現已支持在數組定義中使用:

$sub1 = ['a', 'b'];
$sub2 = ['c', 'd'];
$merge = [...$sub1, ...$sub2]; // 合并兩個數組
var_dump($merge);

僅支持展開索引數組,關聯數組需在PHP 8.1中才開始支持。

PHP 8.0

官方文檔

1)match表達式

match表達式用于對條件的值進行比較,然后進行分支計算,基本用法:

$status = 1;$ret = match($status) {0       => '禁用',1       => '啟用',default => '未知',
};var_dump($ret); // 輸出:啟用

match表達式跟switch表達式比較相似,它們之間的區別為:
1)match表達式在比較條件值的時候,用的是嚴格比較(===),而switch用的是松散比較(==):

$status = '1';$ret = match($status) {1   => '啟用1','1' => '啟用2',
};var_dump($ret); // 輸出:啟用2

2)match支持表達式計算:

$age = 15;$ret = match(true) {$age <  18 => '未成年',$age >= 18 => '已成年',
};var_dump($ret); // 輸出:未成年

甚至調用函數都可以:

$num = 4;$ret = match($num) {pow(2, 1) => '2的一次方',pow(2, 2) => '2的二次方',
};var_dump($ret); // 輸出:2的二次方

邏輯OR:

$num = 4;$ret = match($num) {2, 4, 6 => '偶數', // 邏輯OR,當$num為2或4或6時,分支條件成立
};var_dump($ret); // 輸出:偶數

3)match的分支必須列舉出所有可能的情況,如果所有分支條件都不成立,會拋出UnhandledMatchError錯誤,我們可以使用default關鍵字來解決此問題:

$status = 3;$ret = match($status) {0       => '禁用',1       => '啟用1',default => '未知',  // 如果沒有此分支,會拋出錯誤
};var_dump($ret); // 輸出:未知

2)Nullsafe運算符

在對象的鏈式調用中,如果中間任一環節返回了NULL,會導致PHP報錯:

$result = $repository->getUser(5)->name; // 如果getUser方法返回了NULL,就會報錯

可以使用NullSafe運算符?->來解決此問題:

$result = $repository?->getUser(5)?->name; // 不會報錯,$result的值為NULL

3)命名參數

支持根據參數名傳參,好處:可以跳過某些默認值參數,不必再傳一遍。

function sum($a = 1, $b = 2, $c = 3)
{return $a + $b + $c;
}// 假設要傳c參數過去,其它參數保持默認值不變
// php8前,a、b參數是必須傳的,不能省略
sum(1, 2, 6);// php8,可以只傳c參數
sum(c: 6);// 甚至順序都可以打亂
sum(c: 6, a: 2, b: 3);

4)聯合類型聲明

使用|來連接多個類型,它們之間是“或”的關系:

// $a的類型可以是int,或者float
function sum(int|float $a = 1, int|float $b = 2): float|int
{return $a + $b;
}

5)新增mixed類型

mixed代表任何類型,可以接受任何類型的值,是頂級類型。

function foo(mixed $str): mixed
{
}

6)對象可以通過::class獲取類名

現在可以通過 $object::class 獲取類名,返回的結果和 get_class($object) 一致。

$obj = new StdClass();var_dump($obj::class); // 輸出:stdClass
var_dump(get_class($obj)); // 輸出:stdClass

7)構造器屬性提升

類的構造器里的參數,如果帶有可見性修飾符(private/protected/public),那么這個參數會自動被添加為類的屬性:

class Person
{public function __construct(public string $name){}
}$obj = new Person('tim');
// 雖然沒有顯示定義name屬性,但仍然可以訪問
var_dump($obj->name); // 輸出:tim

8)注解

新增注解功能。

PHP 8.1

官方文檔

1)枚舉類型

枚舉類型Enum用于定義一組包含若干個可能值的集合,它本質上是一個類,可以像普通的class一樣,定義自己的方法、實現接口,但是不支持繼承、不支持new實例化。

Enum分為純粹Enum(Pure Enum)和回退Enum(Backed Enum)兩種,定義:

// 純粹Enum,沒有case值
enum Pure
{case One;case Two;
}// 回退Enum,有case值
// case值僅支持string和int兩種類型
enum Backed: string
{case One = 'A';case Two = 'B';
}// 訪問單個case條目
var_dump(Pure::One);// 獲取Enum里的所有case條目
var_dump(Pure::cases()); // 返回的是一個數組

參數類型約束:

enum Status
{case Pending;case Completed;case Failed;
}function setStatus(Status $stat)
{
}setStatus(Status::Pending); // 合法值,正常
setStatus('success'); // success不是Status枚舉類型的合法值,報錯

Enum的每個條目(case)都是該Enum的一個對象,并且有一個只讀name屬性:

// Pending是Status的一個對象
var_dump(gettype(Status::Pending)); // 輸出:object
var_dump(Status::Pending instanceof Status); // 輸出:true// name屬性的值等于case條目本身的名稱
var_dump(Status::Pending->name); // 輸出:Pending

回退Enum的條目有個額外的只讀屬性value, 它是定義時指定的值:

enum Backed: string
{case One = 'A';case Two = 'B';
}var_dump(Backed::One->value); // 輸出:A

根據case值轉換成Enum,可以使用from或者tryFrom方法:

enum Backed: string
{case One = 'A';case Two = 'B';
}$val1 = 'A';
var_dump(Backed::from($val1)); // 輸出:enum(Backed::One)$val2 = 'C';
var_dump(Backed::from($val2)); // C不是合法值,報ValueError錯誤
var_dump(Backed::tryFrom($val2)); // 不會報錯,輸出:NULL

將枚舉類型轉換為value=>文本數組,可以用于HTML選擇框的展示:

enum UserStatus: int
{case DISABLED = 3;case NORMAL = 4;/*** 返回case條目對應的可讀中文描述* * @return string*/public function text(): string{return match($this) {self::DISABLED => '禁用',self::NORMAL   => '啟用',};}
}$map = [];
foreach (UserStatus::cases() as $case) {$map[$case->value] = $case->text();
}
print_r($map); // 輸出:Array([3] => 禁用 [4] => 啟用)

2)Spread運算符支持展開關聯數組

在PHP 7.4版本已經支持在數組內使用Spread運算符(...)展開數組,但當時僅支持索引數組的展開,現8.1版本已支持關聯數組:

$sub = ['c' => 'cat', 'd' => 'dog'];
$arr = ['a' => 'apple', ...$sub];
print_r($arr); // 輸出:['a' => 'apple', 'c' => 'cat', 'd' => 'dog']

注意:如果有相同的key,后面的值會覆蓋前面的值

3)新增never返回值類型

返回值聲明為never的函數,代表它永遠都不會返回,因此不能包含return語句。里面要么有調用exit()結束腳本,要么拋出異常,要么永遠不會終止(例如死循環)。

function foo(): never
{exit(); // OKwhile(true) {} // OKthrow new Exception('Oh my god'); // OK
}

4)readonly屬性

可以使用 readonly 修飾符聲明類屬性,防止初始化后修改屬性。

class Person
{public readonly string $name;public function setName(string $name): void{$this->name = $name;}
}$p = new Person();
$p->setName('First name'); // 第一次賦值,正常
var_dump($p->name); // 輸出:First name
$p->setName('First name'); // 第二次賦值,報錯:Uncaught Error: Cannot modify readonly property Person::$name

注意:

  • readonly不能用于修飾靜態屬性
  • 只讀屬性只能初始化一次,并且只能從聲明它的作用域內初始化。即使clone出來的新對象也不能重新初始化只讀屬性(自 PHP 8.3.0 起,可以重新初始化)
  • 只讀屬性不能設置默認值,因為具有默認值的只讀屬性等同于常量,因此不是特別有用
  • 如果只讀屬性是一個對象或者資源,那么這個對象里的屬性仍然是可變的
class Name
{public string $firstName = 'first';
}class Person
{public readonly Name $nameObj;public function setName(Name $obj): void{$this->nameObj = $obj;}
}$p = new Person();
$p->setName(new Name()); // 第一次賦值,正常
var_dump($p->nameObj->firstName); // 輸出:first$p->nameObj->firstName = 'new'; // 修改只讀屬性對象的內部屬性,正常
var_dump($p->nameObj->firstName); // 輸出:new// 再次賦值,報錯
$p->setName(new Name());

5)交集類型聲明

使用&來連接不同的類型,它們之間是“且”的關系:

// $val需滿足既是UnitEnum類型,又是ArrayAccess類型
function foo(UnitEnum&ArrayAccess $val)
{
}

6)可以使用final來修飾類常量

使用final關鍵字修飾類常量,防止被子類修改:

class Foo
{final public const X = "foo";
}class Bar extends Foo
{public const X = "bar"; // 不能修改父類中的final常量
}// Fatal error: Bar::X cannot override final constant Foo::X

7)使用new初始化參數

參數、靜態變量、甚至全局常量都可以直接初始化為對象了:

define('MY_CONSTANT', new \StdClass());function foo(object $val = new \StdClass()): void
{
}

PHP 8.2

官方文檔

1)新增true/false/null類型

function foo(null $a, true $b, false $c)
{
}

過時:動態屬性

在舊版本中,如果嘗試在 object 上賦值不存在的屬性,PHP 將會自動創建相應的屬性:

class Person {}$obj = new Person();
$obj->name = 'xxx'; // 舊版本中,可以賦值不存在的屬性
var_dump($obj->name);

自 PHP 8.2.0 起此特性被標記為過時(Deprecated)。建議更改為屬性聲明。要處理任意屬性名稱,類應該實現魔術方法 __get()__set()。最后可以使用 #[\AllowDynamicProperties] 注解標記此類。

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

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

相關文章

【記】如何理解kotlin中的委托屬性?

1. 什么是委托屬性&#xff1f; 委托屬性的核心思想是&#xff1a; 你可以將一個屬性的 getter 和 setter 的邏輯交給一個外部對象&#xff08;稱為委托對象&#xff09;來處理。這個外部對象負責存儲屬性的值&#xff0c;并提供自定義的 get 和 set 行為。 通過委托屬性&am…

使用自動導入后,eslint報錯 eslint9

前提&#xff1a;使用pnpm create vuelatest創建vue應用&#xff0c;并且在創建項目時就勾選eslint和prettier&#xff0c;不然有些配置還需要手動配&#xff0c;比如解決eslint和prettier的沖突問題 1. 解決使用自動導入后Eslint報錯問題 配置vite.config.ts // 自動導入api…

springboot EasyExcel 實現導入導出

1. 添加依賴 確保 Maven 依賴中包含 EasyExcel 3.0.5&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency><!-- excel工具 --><dep…

實現懸浮按鈕拖動,兼容h5和微信小程序

h5用js寫&#xff0c;微信小程序用 代碼里面沒有完全實現吸附邊緣的功能&#xff0c;需要吸附邊緣的話還得自己再完善下&#xff08;h5的吸附邊緣是可以的&#xff0c;小程序的還有點問題&#xff09; 主要功能是&#xff1a;圖片上寫文字的懸浮按鈕&#xff0c;文字使用的是…

2、操作系統之軟件基礎

一、硬件支持系統 &#xff0c;系統管理硬件 操作系統核心功能可以分為&#xff1a; 守護者&#xff1a;對硬件和軟件資源的管理協調者&#xff1a;通過機制&#xff0c;將各種各樣的硬件資源適配給軟件使用。 所以為了更好的管理硬件&#xff0c;操作系統引進了軟件。其中3大…

17 | 實現簡潔架構的 Biz 層

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入 云原生 AI 實戰 星球&#xff0c;12 高質量體系課、20 高質量實戰項目助你在 AI 時代建立技術競爭力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本節課最終…

idea更新git代碼報錯No Git Roots

idea更新git代碼報錯&#xff1a; No Git Roots None of configured Git roots are under Git. The configured directory must have ".git directory in it.但是本地項目里是存在.git文件的&#xff0c;就是突然間不能更新代碼了 然后嘗試重新拉新項目代碼提示: Git i…

Webpack 知識點整理

? 1. 對 webpack 的理解&#xff1f;解決了什么問題&#xff1f; Webpack 是前端工程化領域的核心工具&#xff0c;其核心定位是模塊打包器&#xff08;Module Bundler&#xff09;&#xff0c;通過將各類資源&#xff08;JS、CSS、圖片等&#xff09;視為模塊并進行智能整合…

[Hello-CTF]RCE-Labs超詳細WP-Level13Level14(PHP下的0/1構造RCE命令簡單的字數限制RCE)

Level 13 源碼分析 這題又回到了 PHP重點關注preg_match("/[A-Za-z0-9\"%*,-.\/:;>?[\]^|]/", $cmd)禁用了所有數字, 并且回到了 PHP, 沒辦法用上一關的方法進行繞過但是比起上一關, 給我們少繞過了 &, ~, _似乎有其他方法 解題分析 利用 $(()) 和 …

Qt 控件概述 QWdiget 1.1

目錄 qrc機制 qrc使用 1.在項目中創建一個 qrc 文件 2.將圖片導入到qrc文件中 windowOpacity&#xff1a; cursor 光標 cursor類型 自定義Cursor font tooltip focusPolicy styleSheet qrc機制 之前提到使用相對路徑的方法來存放資源&#xff0c;還有一種更好的方式…

【eNSP實戰】將路由器配置為DHCP服務器

拓圖 要求&#xff1a; 為 office100 和 office200 分別配置地址池 AR1接口配置 interface GigabitEthernet0/0/0ip address 192.168.100.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 192.168.200.1 255.255.255.0 AR1路由器上創建office100地址池 [AR1…

數據結構——順序表seqlist

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介紹了數據結構——順序表部分的內容 目錄 一、線性表的定義 二、線性表的基本操作 三.順序表 1.定義 2. 存儲結構 3. 特點 四 順序表操作 4.1初始化 4.2 插入 4.2.1頭插 4.2.2 尾插 4.2.3 按位置插 4.3 …

OSPF | LSDB 鏈路狀態數據庫 / SPF 算法 / 實驗

注&#xff1a;本文為 “OSPF | LSDB / SPF ” 相關文章合輯。 LSDB 和 SPF 算法 瀟湘浪子的蹋馬骨湯 發布 2019-02-15 23:58:46 1. 鏈路狀態數據庫 (LSDB) 鏈路狀態協議除了執行洪泛擴散鏈路狀態通告&#xff08;LSA&#xff09;以及發現鄰居等任務外&#xff0c;其第三個任…

前端---CSS(前端三劍客)

1.基本語法規范 選擇器 {?條/N條聲明} ? 選擇器決定針對誰修改 (找誰) ? 聲明決定修改啥. (?啥) ? 聲明的屬性是鍵值對. 使? ; 區分鍵值對, 使? : 區分鍵和值 比如&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta…

【C++】 —— 筆試刷題day_6

刷題day_6&#xff0c;繼續加油哇&#xff01; 今天這三道題全是高精度算法 一、大數加法 題目鏈接&#xff1a;大數加法 題目解析與解題思路 OK&#xff0c;這道題題目描述很簡單&#xff0c;就是給我們兩個字符串形式的數字&#xff0c;讓我們計算這兩個數字的和 看題目我…

todolist docker 小工具

參考鏈接 前排提示 沒有中文&#xff0c;可使用瀏覽器 翻譯 前提 安裝docker安裝docker-compose 下載倉庫 git clone https://github.com/JordanKnott/taskcafe進行安裝 cd taskcafe docker-compose -p taskcafe up -d服務啟動后會監聽在 3333 端口上&#xff0c;通過瀏覽器…

Unity--GPT-SoVITS接入、處理GPTAPI的SSE響應流

GPT-SoVITS GPT-SoVITS- v2&#xff08;v3也可以&#xff0c;兩者對模型文件具有兼容&#xff09; 點擊后 會進入新的游覽器網頁 ----- 看了一圈&#xff0c;發現主要問題集中在模型的訓練很需要CPU&#xff0c;也就是模型的制作上&#xff0c;問題很多&#xff0c;如果有現有…

《TypeScript 快速上手:類型、編譯與嚴格模式的簡明教程》

一、TypeScript介紹 在引入編程社區 20 多年后&#xff0c;JavaScript 現在已成為有史以來應用最廣泛的跨平臺語言之一。JavaScript 最初是一種用于向網頁添加微不足道的交互性的小型腳本語言&#xff0c;現已發展成為各種規模的前端和后端應 用程序的首選語言。雖然用 JavaSc…

ROS2 系統架構

1.操作系統層 ros2是基于Linux、Windows、macOS系統建立的&#xff0c;這一層為ros2提供了各種基礎的硬件驅動&#xff0c;比如網卡驅動&#xff0c;常用USB驅動和常用攝像頭驅動等。 2.DDS實現層 ros2的核心通信是采用第三方的通信組件來實現的&#xff0c;這個第三方就是數…

【HTML】二、列表、表格

文章目錄 1、列表1.1 無序列表1.2 有序列表1.3 定義列表 2、表格2.1 定義2.2 表格結構標簽2.3 合并單元格 1、列表 列表分為&#xff1a; 無序列表有序列表定義列表&#xff1a;一個標題下有多個小分類 1.1 無序列表 ul嵌套li&#xff0c;ul是無序列表&#xff0c;li是列表…