PHP5各個版本的新功能和新特性總結

来源:http://www.cnblogs.com/roucheng/archive/2016/06/22/php5texing.html
-Advertisement-
Play Games

因為 PHP 那“集百家之長”的蛋疼語法,加上社區氛圍不好,很多人對新版本,新特征並無興趣。本文將會介紹自 PHP5.2 起,直至 PHP5.6 中增加的新特征 本文目錄:PHP5.2 以前:autoload, PDO 和 MySQLi, 類型約束PHP5.2:JSON 支持PHP5.3:棄用的功能 ...


因為 PHP 那“集百家之長”的蛋疼語法,加上社區氛圍不好,很多人對新版本,新特征並無興趣。本文將會介紹自 PHP5.2 起,直至 PHP5.6 中增加的新特征

本文目錄:
PHP5.2 以前:autoload, PDO 和 MySQLi, 類型約束
PHP5.2:JSON 支持
PHP5.3:棄用的功能,匿名函數,新增魔術方法,命名空間,後期靜態綁定,Heredoc 和 Nowdoc, const, 三元運算符,Phar
PHP5.4:Short Open Tag, 數組簡寫形式,Traits, 內置 Web 伺服器,細節修改
PHP5.5:yield, list() 用於 foreach, 細節修改
PHP5.6: 常量增強,可變函數參數,命名空間增強

一、PHP5.2以前(2006前)
順便介紹一下 PHP5.2 已經出現但值得介紹的特征。
autoload
大家可能都知道 __autoload() 函數,如果定義了該函數,那麼當在代碼中使用一個未定義的類的時候,該函數就會被調用,你可以在該函數中載入相應的類實現文件,如:

function __autoload($classname)
{
    require_once("{$classname}.php")
}/* 何問起 hovertree.com */

但該函數已經不被建議使用,原因是一個項目中僅能有一個這樣的 __autoload() 函數,因為 PHP 不允許函數重名。但當你使用一些類庫的時候,難免會出現多個 autoload 函數的需要,於是 spl_autoload_register() 取而代之:

 
spl_autoload_register(function($classname)
{
    require_once("{$classname}.php")
});/* hovertree.top */

spl_autoload_register() 會將一個函數註冊到 autoload 函數列表中,當出現未定義的類的時候,SPL [註] 會按照註冊的倒序逐個調用被註冊的 autoload 函數,這意味著你可以使用 spl_autoload_register() 註冊多個 autoload 函數.
註:SPL: Standard PHP Library, 標準 PHP 庫, 被設計用來解決一些經典問題(如數據結構).

 

PDO 和 MySQLi
即 PHP Data Object, PHP 數據對象,這是 PHP 的新式資料庫訪問介面。
按照傳統的風格,訪問 MySQL 資料庫應該是這樣子:

// 連接到伺服器,選擇資料庫
$conn = mysql_connect("localhost", "user", "password");
mysql_select_db("database");
// 執行 SQL 查詢
$type = $_POST['type'];
$sql = "SELECT * FROM `table` WHERE `type` = {$type}";
$result = mysql_query($sql);
// 列印結果
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    foreach($row as $k => $v)
        print "{$k}: {$v}\n";
}
// 釋放結果集,關閉連接
mysql_free_result($result);
mysql_close($conn);
/* hwq2.com */

為了能夠讓代碼實現資料庫無關,即一段代碼同時適用於多種資料庫(例如以上代碼僅僅適用於MySQL),PHP 官方設計了 PDO.
除此之外,PDO 還提供了更多功能,比如:

 

1.面向對象風格的介面
2.SQL預編譯(prepare), 占位符語法
3.更高的執行效率,作為官方推薦,有特別的性能優化
4.支持大部分SQL資料庫,更換資料庫無需改動代碼

上面的代碼用 PDO 實現將會是這樣:

// 連接到資料庫
$conn = new PDO("mysql:host=localhost;dbname=database", "user", "password");
// 預編譯SQL, 綁定參數
$query = $conn->prepare("SELECT * FROM `table` WHERE `type` = :type");
$query->bindParam("type", $_POST['type']);
// 執行查詢並列印結果
foreach($query->execute() as $row)
{
    foreach($row as $k => $v)
        print "{$k}: {$v}\n";
}// 何問起 hovertree.com

PDO 是官方推薦的,更為通用的資料庫訪問方式,如果你沒有特殊需求,那麼你最好學習和使用 PDO.
但如果你需要使用 MySQL 所特有的高級功能,那麼你可能需要嘗試一下 MySQLi, 因為 PDO 為了能夠同時在多種資料庫上使用,不會包含那些 MySQL 獨有的功能。

 

MySQLi 是 MySQL 的增強介面,同時提供面向過程和麵向對象介面,也是目前推薦的 MySQL 驅動,舊的C風格 MySQL 介面將會在今後被預設關閉。
MySQLi 的用法和以上兩段代碼相比,沒有太多新概念,在此不再給出示例,可以參見 PHP 官網文檔 [註]。

註:http://www.php.net/manual/en/mysqli.quickstart.php

類型約束
通過類型約束可以限制參數的類型,不過這一機制並不完善,目前僅適用於類和 callable(可執行類型) 以及 array(數組), 不適用於 string 和 int.

// 限制第一個參數為 MyClass, 第二個參數為可執行類型,第三個參數為數組
function MyFunction(MyClass $a, callable $b, array $c)
{
    // ...
}// 何問起 hovertree.com

PHP5.2(2006-2011):JSON 支持

包括 json_encode(), json_decode() 等函數,JSON 算是在 Web 領域非常常用的數據交換格式,可以被 JS 直接支持,JSON 實際上是 JS 語法的一部分。
JSON 系列函數,可以將 PHP 中的數組結構與 JSON 字元串進行轉換:

$array = ["key" => "value", "array" => [1, 2, 3, 4]];
$json = json_encode($array);
echo "{$json}\n";
$object = json_decode($json);
print_r($object);/* hovertree.top */

輸出:

{"key":"value","array":[1,2,3,4]}
stdClass Object
(
    [key] => value
    [array] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )
)

值得註意的是 json_decode() 預設會返回一個對象而非數組,如果需要返回數組需要將第二個參數設置為 true.

 

PHP5.3(2009-2012)
PHP5.3 算是一個非常大的更新,新增了大量新特征,同時也做了一些不向下相容的修改。
【PHP5.3棄用的功能】:以下幾個功能被棄用,若在配置文件中啟用,則 PHP 會在運行時發出警告。

Register Globals
這是 php.ini 中的一個選項(register_globals), 開啟後會將所有表單變數($_GET和$_POST)註冊為全局變數.
看下麵的例子:

if(isAuth())
    $authorized = true;
if($authorized)
    include("page.php");/* hovertree.top */

這段代碼在通過驗證時,將 $authorized 設置為 true. 然後根據 $authorized 的值來決定是否顯示頁面.
但由於並沒有事先把 $authorized 初始化為 false, 當 register_globals 打開時,可能訪問 /auth.php?authorized=1 來定義該變數值,繞過身份驗證。
該特征屬於歷史遺留問題,在 PHP4.2 中被預設關閉,在 PHP5.4 中被移除。

 

Magic Quotes

對應 php.ini 中的選項 magic_quotes_gpc, 這個特征同樣屬於歷史遺留問題,已經在 PHP5.4 中移除。
該特征會將所有用戶輸入進行轉義,這看上去不錯,在第一章我們提到過要對用戶輸入進行轉義。
但是 PHP 並不知道哪些輸入會進入 SQL , 哪些輸入會進入 Shell, 哪些輸入會被顯示為 HTML, 所以很多時候這種轉義會引起混亂。

Safe Mode
很多虛擬主機提供商使用 Safe Mode 來隔離多個用戶,但 Safe Mode 存在諸多問題,例如某些擴展並不按照 Safe Mode 來進行許可權控制。
PHP官方推薦使用操作系統的機制來進行許可權隔離,讓Web伺服器以不同的用戶許可權來運行PHP解釋器,請參見第一章中的最小許可權原則.

【PHP5.3的新增、改進】

匿名函數
也叫閉包(Closures), 經常被用來臨時性地創建一個無名函數,用於回調函數等用途。

$func = function($arg)
{
    print $arg;
};
$func("Hello World! hovertree.top");

以上代碼定義了一個匿名函數,並賦值給了 $func.
可以看到定義匿名函數依舊使用 function 關鍵字,只不過省略了函數名,直接是參數列表。
然後我們又調用了 $func 所儲存的匿名函數。
匿名函數還可以用 use 關鍵字來捕捉外部變數:

function arrayPlus($array, $num)
{
    array_walk($array, function(&$v) use($num){
        $v += $num;
    });
}/* hovertree.top */

上面的代碼定義了一個 arrayPlus() 函數(這不是匿名函數), 它會將一個數組($array)中的每一項,加上一個指定的數字($num).
在 arrayPlus() 的實現中,我們使用了 array_walk() 函數,它會為一個數組的每一項執行一個回調函數,即我們定義的匿名函數。
在匿名函數的參數列表後,我們用 use 關鍵字將匿名函數外的 $num 捕捉到了函數內,以便知道到底應該加上多少。

 

魔術方法:__invoke(), __callStatic()
PHP 的面向對象體系中,提供了若幹“魔術方法”,用於實現類似其他語言中的“重載”,如在訪問不存在的屬性、方法時觸發某個魔術方法。
隨著匿名函數的加入,PHP 引入了一個新的魔術方法 __invoke().
該魔術方法會在將一個對象作為函數調用時被調用:

class A
{
    public function __invoke($str)
    {
        print "A::__invoke(): {$str}";
    }
}
$a = new A;
$a("Hello World!何問起");

輸出毫無疑問是:

A::__invoke(): Hello World

__callStatic() 則會在調用一個不存在的靜態方法時被調用。

 


命名空間
PHP的命名空間有著前無古人後無來者的無比蛋疼的語法:

<?php
// 命名空間的分隔符是反斜杠,該聲明語句必須在文件第一行。
// 命名空間中可以包含任意代碼,但只有 **類, 函數, 常量** 受命名空間影響。
namespace XXOO\Test;
// 該類的完整限定名是 \XXOO\Test\A , 其中第一個反斜杠表示全局命名空間。
class A{}
// 你還可以在已經文件中定義第二個命名空間,接下來的代碼將都位於 \Other\Test2 .
namespace Other\Test2;
// 實例化來自其他命名空間的對象:
$a = new \XXOO\Test\A;
class B{}
// 你還可以用花括弧定義第三個命名空間
/* 何問起 hovertree.com */
namespace Other {
    // 實例化來自子命名空間的對象:
    $b = new Test2\B;
    // 導入來自其他命名空間的名稱,並重命名,
    // 註意只能導入類,不能用於函數和常量。
    use \XXOO\Test\A as ClassA
}
?>

更多有關命名空間的語法介紹請參見官網 [註].
命名空間時常和 autoload 一同使用,用於自動載入類實現文件:

spl_autoload_register(
    function ($class) {
        spl_autoload(str_replace("\\", "/", $class));
    }
);

當你實例化一個類 \XXOO\Test\A 的時候,這個類的完整限定名會被傳遞給 autoload 函數,autoload 函數將類名中的命名空間分隔符(反斜杠)替換為斜杠,並包含對應文件。
這樣可以實現類定義文件分級儲存,按需自動載入。
註:http://www.php.net/manual/zh/language.namespaces.php

後期靜態綁定
PHP 的 OPP 機制,具有繼承和類似虛函數的功能,例如如下的代碼:

class A
{
    public function callFuncXXOO()
    {
        print $this->funcXXOO();
    }
    public function funcXXOO()
    {
        return "A::funcXXOO()";
    }
}
class B extends A
{
    public function funcXXOO()
    {
        return "B::funcXXOO";
    }
}
$b = new B;
$b->callFuncXXOO();/* 何問起 hovertree.com */

輸出是:

B::funcXXOO

可以看到,當在 A 中使用 $this->funcXXOO() 時,體現了“虛函數”的機制,實際調用的是 B::funcXXOO().
然而如果將所有函數都改為靜態函數:

class A
{
    static public function callFuncXXOO()
    {
        print self::funcXXOO();
    }
    static public function funcXXOO()
    {
        return "A::funcXXOO()";
    }
}
class B extends A
{
    static public function funcXXOO()
    {
        return "B::funcXXOO";
    }
}
$b = new B;
$b->callFuncXXOO();

情況就沒這麼樂觀了,輸出是:

A::funcXXOO()

這是因為 self 的語義本來就是“當前類”,所以 PHP5.3 給 static 關鍵字賦予了一個新功能:後期靜態綁定:

class A
{
    static public function callFuncXXOO()
    {
        print static::funcXXOO();
    }
    // ...
}
// ...

這樣就會像預期一樣輸出了:

B::funcXXOO

Heredoc 和 Nowdoc

PHP5.3 對 Heredoc 以及 Nowdoc 進行了一些改進,它們都用於在 PHP 代碼中嵌入大段字元串。
Heredoc 的行為類似於一個雙引號字元串:

$name = "MyName";
echo <<< TEXT
My name is "{$name}".
TEXT;

Heredoc 以三個左尖括弧開始,後面跟一個標識符(TEXT), 直到一個同樣的頂格的標識符(不能縮進)結束。
就像雙引號字元串一樣,其中可以嵌入變數。

 

Heredoc 還可以用於函數參數,以及類成員初始化:

var_dump(<<<EOD
Hello World
EOD
);
class A
{
    const xx = <<< EOD
Hello World
EOD;
    public $oo = <<< EOD
Hello World
EOD;
}

Nowdoc 的行為像一個單引號字元串,不能在其中嵌入變數,和 Heredoc 唯一的區別就是,三個左尖括弧後的標識符要以單引號括起來:

$name = "MyName";
echo <<< 'TEXT'
My name is "{$name}".
TEXT;

輸出:

My name is "{$name}".

用 const 定義常量

PHP5.3 起同時支持在全局命名空間和類中使用 const 定義常量。
舊式風格:

define("XOOO", "Value");

新式風格:
const XXOO = "Value";
const 形式僅適用於常量,不適用於運行時才能求值的表達式:

// 正確
const XXOO = 1234;
// 錯誤
const XXOO = 2 * 617;

三元運算符簡寫形式
舊式風格:

echo $a ? $a : "No Value";

可簡寫成:

echo $a ?: "No Value";

即如果省略三元運算符的第二個部分,會預設用第一個部分代替。

 

Phar

Phar即PHP Archive, 起初只是Pear中的一個庫而已,後來在PHP5.3被重新編寫成C擴展並內置到 PHP 中。
Phar用來將多個 .php 腳本打包(也可以打包其他文件)成一個 .phar 的壓縮文件(通常是ZIP格式)。
目的在於模仿 Java 的 .jar, 不對,目的是為了讓發佈PHP應用程式更加方便。同時還提供了數字簽名驗證等功能。
.phar 文件可以像 .php 文件一樣,被PHP引擎解釋執行,同時你還可以寫出這樣的代碼來包含(require) .phar 中的代碼:

require("xxoo.phar");
require("phar://xxoo.phar/xo/ox.php");

更多信息請參見官網 [註].
註:http://www.php.net/manual/zh/phar.using.intro.php

 

PHP5.4(2012-2013)

Short Open Tag
Short Open Tag 自 PHP5.4 起總是可用。
在這裡集中講一下有關 PHP 起止標簽的問題。即:

<?php
// Code...  何問起 hovertree.com
?>

通常就是上面的形式,除此之外還有一種簡寫形式:

<? /* Code... */ ?>

還可以把

<?php echo $xxoo;?>

簡寫成:

<?= $xxoo;?>

這種簡寫形式被稱為 Short Open Tag, 在 PHP5.3 起被預設開啟,在 PHP5.4 起總是可用。
使用這種簡寫形式在 HTML 中嵌入 PHP 變數將會非常方便。

 

對於純 PHP 文件(如類實現文件), PHP 官方建議頂格寫起始標記,同時 省略 結束標記。
這樣可以確保整個 PHP 文件都是 PHP 代碼,沒有任何輸出,否則當你包含該文件後,設置 Header 和 Cookie 時會遇到一些麻煩 [註].

註:Header 和 Cookie 必須在輸出任何內容之前被髮送。

數組簡寫形式
這是非常方便的一項特征!

// 原來的數組寫法
$arr = array("key" => "value", "key2" => "value2");
// 簡寫形式
$arr = ["key" => "value", "key2" => "value2"];
// 何問起 hovertree.com

Traits
所謂Traits就是“構件”,是用來替代繼承的一種機制。PHP中無法進行多重繼承,但一個類可以包含多個Traits.

// Traits不能被單獨實例化,只能被類所包含
trait SayWorld
{
    public function sayHello()
    {
        echo 'World!';
    }
}
class MyHelloWorld
{
    // 將SayWorld中的成員包含進來
    use SayWorld;
}
$xxoo = new MyHelloWorld();
// sayHello() 函數是來自 SayWorld 構件的
$xxoo->sayHello();

Traits還有很多神奇的功能,比如包含多個Traits, 解決衝突,修改訪問許可權,為函數設置別名等等。
Traits中也同樣可以包含Traits. 篇幅有限不能逐個舉例,詳情參見官網 [註].
註:http://www.php.net/manual/zh/language.oop5.traits.php

 

內置 Web 伺服器
PHP從5.4開始內置一個輕量級的Web伺服器,不支持併發,定位是用於開發和調試環境。
在開發環境使用它的確非常方便。

php -S localhost:8000

這樣就在當前目錄建立起了一個Web伺服器,你可以通過 http://localhost:8000/ 來訪問。
其中localhost是監聽的ip,8000是監聽的埠,可以自行修改。

 

很多應用中,都會進行URL重寫,所以PHP提供了一個設置路由腳本的功能:

php -S localhost:8000 index.php

這樣一來,所有的請求都會由index.php來處理。
你還可以使用 XDebug 來進行斷點調試。

 

細節修改
PHP5.4 新增了動態訪問靜態方法的方式:

$func = "funcXXOO";
A::{$func}();

新增在實例化時訪問類成員的特征:

(new MyClass)->xxoo();

新增支持對函數返回數組的成員訪問解析(這種寫法在之前版本是會報錯的):

print func()[0];

PHP5.5(2013起)

yield
yield關鍵字用於當函數需要返回一個迭代器的時候, 逐個返回值。

function number10()
{
    for($i = 1; $i <= 10; $i += 1)
        yield $i;
}

該函數的返回值是一個數組:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

list() 用於 foreach
可以用 list() 在 foreach 中解析嵌套的數組:

$array = [
    [1, 2, 3],
    [4, 5, 6],
];
foreach ($array as list($a, $b, $c))
    echo "{$a} {$b} {$c}\n";

結果:

1 2 3
4 5 6

細節修改
不推薦使用 mysql 函數,推薦使用 PDO 或 MySQLi, 參見前文。
不再支持Windows XP.
可用 MyClass::class 取到一個類的完整限定名(包括命名空間)。
empty() 支持表達式作為參數。
try-catch 結構新增 finally 塊。

 

PHP5.6

更好的常量
定義常量時允許使用之前定義的常量進行計算:

const A = 2;
const B = A + 1;
class C
{
    const STR = "hello";
    const STR2 = self::STR + ", world";
}

允許常量作為函數參數預設值:

function func($arg = C::STR2)

更好的可變函數參數
用於代替 func_get_args()

function add(...$args)
{
    $result = 0;
    foreach($args as $arg)
        $result += $arg;
    return $result;
}// 何問起 hovertree.com

同時可以在調用函數時,把數組展開為函數參數:// 結果為 6
命名空間
命名空間支持常量和函數:

namespace Name\Space {
    const FOO = 42;
    function f() { echo __FUNCTION__."\n"; }
}
namespace {
    use const Name\Space\FOO;
    use function Name\Space\f;
    echo FOO."\n";
    f();
}

推薦:http://www.cnblogs.com/roucheng/p/3454913.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • python 數據的拷貝 ...
  • 抽象類就是抽象的類,抽象是相對於具體而言的,一般而言,具體類有直接對應的對象,而抽象類沒有,它表達的是抽象概念 ... 但為什麼非要顯式將類設為抽象的呢?抽象類和介面某些地方很像,但其實根本不同,不過又互相聯繫,它們到底有著怎樣的關係呢? ...
  • 利用PHP,將資料庫中的文章數據生成單個的HTML文檔。首先,有利於搜索引擎的收錄。其次,避免資料庫中的欄位暴露在地址欄上,更安全。 給出代碼: <?php //引入資料庫配置文件 include( dirname(dirname(lxx_file))."\include\config.php" ) ...
  • 雙向鏈表實現 今天晚上用模板方法把雙向鏈表實現了下,由於有點小粗心,在 insert中手抖了下,把tail->prev 打成了 tail->next,由於錯誤是發生在drop函數執行時,讓我一直去調drop函數,調了半天還是一樣錯誤,最後我系統在vs中監視了下值的變化,終於看到是insert出錯了。 ...
  • 我們知道,(1)如果是整百的年份,能被400整除的,是閏年;(2)如果不是整百的年份,能被4整除的,也是閏年。每400年,有97個閏年。鑒於此,程式可以作以下設計: 第一步,判斷年份是否被400整除,能的話,就是閏年。比如1600、2000、2400年是閏年。 第二步,在第一步不成立的基礎上,判斷年 ...
  • 在jsp頁面中輸出完整的時間,格式為"年 月 日 時:分:秒" ...
  • 在導入文件的時候,Python只搜索當前腳本所在的目錄,載入(entry point)入口腳本運行目錄和sys.path中包含的路徑例如包的安裝地址。所以如果要在當前腳本引用其他文件,除了將文件放在和腳本同一目錄下,還有以下幾種方法, 1. 將文件所在位置添加到sys.path中 2. 在文件目錄下 ...
  • 這是ZK學習筆記的下篇, 主要希望可以分享一些 ZK 的應用以及其應用原理 我本人的學習告一段落, 不過還遺留了一些ZK相關的任務開發和性能測試的任務, 留待以後完成之後再通過其他文章來進行分享了 ZK應用場景: 1. 一個服務多台機器, 快速修改配置 2. 服務的消費者如何動態知道服務有多少個提供 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...