<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?PHP 8.1 即將到來

          共 5213字,需瀏覽 11分鐘

           ·

          2021-07-11 04:33

          PHP 8.1 目前正在積極開發(fā)中,將于2021年11 月 25 日發(fā)布。請記住,如果核心開發(fā)團(tuán)隊(duì)(例如)添加額外的 Beta 版本,此日期仍可能會(huì)更改。我們已經(jīng)了解新功能、性能改進(jìn)、更改和棄用;所以讓我們一一介紹。

          1

          Enums(枚舉)


          枚舉將在 PHP 8.1 中添加!

          添加枚舉將是 PHP 的重大改進(jìn),因此我非常期待看到枚舉在 PHP 8.1 中出現(xiàn)。為了讓您快速預(yù)覽它們的外觀,這里有一個(gè)代碼示例:


          enum Status {
            case Pending;
            case Active;
            case Archived;
          }


          這就是它們的使用方式:


          class Post
          {
              public function __construct(private Status $status = Status::Pending;)
             {}

              public function setStatus(Status $status)void
              
          {
                  // …
              }
          }

          $post->setStatus(Status::Active);


          2

          Fibers(纖程)


          Fibers——又名“綠色線程” ——是一種管理并行性的低級機(jī)制。您可能不會(huì)直接在您的應(yīng)用程序中使用它們,但是像 Amphp 和 ReactPHP 這樣的框架會(huì)大量使用它們


          這是使用纖維的簡單示例:


          $fiber = new Fiber(function ()void {
              $valueAfterResuming = Fiber::suspend('after suspending');

              // … 
          });

          $valueAfterSuspending = $fiber->start();

          $fiber->resume('after resuming');


          3

          性能改進(jìn)


          Dmitry Stogov 對 opcache 進(jìn)行了一些改進(jìn),他稱之為“繼承緩存”。此功能允許緩存類之間的鏈接,就像從 PHP 7.4 開始可以預(yù)加載鏈接的類一樣。


          由于這一變化,Dmitry 報(bào)告了 5% 到 8% 的性能提升,這是 PHP 8.1 中需要注意的一個(gè)很好的小細(xì)節(jié)。


          4

          使用字符串鍵重寫數(shù)組


          PHP 7.4 中已經(jīng)允許數(shù)組解包,但它只適用于數(shù)字鍵。之前不支持字符串鍵的原因是因?yàn)閷τ谌绾魏喜?shù)組重復(fù)項(xiàng)沒有達(dá)成任何共識。RFC 通過遵循以下語義干凈地解決了這個(gè)問題array_merge:


          $array1 = ["a" => 1];

          $array2 = ["b" => 2];

          $array = ["a" => 0, ...$array1, ...$array2];

          var_dump($array); // ["a" => 1, "b" => 2]


          5

          類構(gòu)造賦值


          這個(gè) RFC 允許你new在函數(shù)定義中使用關(guān)鍵字作為默認(rèn)參數(shù),以及在屬性參數(shù)和其他地方。


          class MyController {
              public function __construct(
                  private Logger $logger = new NullLogger(),
              )
           
          {}
          }


          請注意,此 RFC 仍在投票中,但很明顯它會(huì)通過。


          6

          只讀屬性


          類屬性可以標(biāo)記為只讀,這意味著它們只能寫入一次。


          class PostData {
              public function __construct(
                  public readonly string $title,
                  public readonly DateTimeImmutable $date,
              )
           
          {}
          }


          在初始化后嘗試更改只讀屬性將導(dǎo)致錯(cuò)誤:


          $post = new Post('Title'/* … */);

          $post->title = 'Other';

          Error: Cannot modify readonly property Post::$title


          請注意,此 RFC 仍在投票中,但很明顯它會(huì)通過。


          7

          可調(diào)用對象語法


          您現(xiàn)在可以通過調(diào)用可調(diào)用對象并將其...作為參數(shù)傳遞來從可調(diào)用對象創(chuàng)建閉包:


          function foo(int $a, int $b) /* … */ }

          $foo = foo(...);

          $foo(a: 1, b: 2);


          請注意,此 RFC 仍在投票中,但很明顯它會(huì)通過。


          8

          新的never類型


          never類型可用于指示函數(shù)將實(shí)際停止程序流。這可以通過拋出異常、調(diào)用exit或其他類似函數(shù)來完成。


          function dd(mixed $input)never
          {
              // dump

              exit;
          }


          never不同之處void在于void仍然允許程序繼續(xù)。這似乎是一個(gè)新奇的功能,但它實(shí)際上對靜態(tài)分析器來說是一個(gè)非常有用的功能。


          9

          新的array_is_list方法


          您可能偶爾不得不處理這個(gè)問題:確定數(shù)組的鍵是否按數(shù)字順序排列,從索引 0 開始。就像json_encode決定數(shù)組應(yīng)該被編碼為數(shù)組還是對象一樣。


          PHP 8.1 添加了一個(gè)內(nèi)置函數(shù)來確定數(shù)組是否是具有這些下標(biāo)的列表:


          $list = ["a""b""c"];

          array_is_list($list); // true

          $notAList = [1 => "a"2 => "b"3 => "c"];

          array_is_list($notAList); // false

          $alsoNotAList = ["a" => "a""b" => "b""c" => "c"];

          array_is_list($alsoNotAList); // false


          10

          最終類常量


          PHP 中的類常量可以在繼承過程中被覆蓋:


          class Foo
          {
              public const X = "foo";
          }

          class Bar extends Foo
          {
              public const X = "bar";
          }


          從 PHP 8.1 開始,您可以將這樣的常量標(biāo)記為final以防止出現(xiàn)這種情況:


          class Foo
          {
              final public const X = "foo";
          }

          class Bar extends Foo
          {
              public const X = "bar";

          Fatal error: Bar::X cannot override final constant Foo::X

          }


          11

          限制$GLOBALS使用


          對如何$GLOBALS使用的微小更改將對所有數(shù)組操作的性能產(chǎn)生重大影響。Nikita 在RFC 中很好地解釋了問題和解決方案。更改意味著某些邊緣情況無法再使用$GLOBALS. “不再支持寫入作為一個(gè)整體的 $GLOBALS。以下所有內(nèi)容都會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤”:


          $GLOBALS = [];
          $GLOBALS += [];
          $GLOBALS =& $x;
          $x =& $GLOBALS;
          unset($GLOBALS);


          最重要的是,通過$GLOBALS引用傳遞會(huì)產(chǎn)生一個(gè)運(yùn)行時(shí)錯(cuò)誤:


          by_ref($GLOBALS); // Run-time error


          Nikita 分析了 Packagist 上排名前 2000 的軟件包,僅發(fā)現(xiàn)了 23 個(gè)會(huì)受此更改影響的案例。我們可以得出這樣的結(jié)論——從技術(shù)上講,這種變化的影響很小,這就是內(nèi)部人員決定在 PHP 8.1 中添加它的原因。


          12

          其他小改動(dòng)


          每次發(fā)布時(shí),都會(huì)對語言進(jìn)行一些非常小的更改。所有這些都列在GitHub 上的升級指南和小的棄用 RFC 中,如果您想了解每個(gè)小細(xì)節(jié),請務(wù)必查看。

          以下是最重要變化的摘要:

          • MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH 不再有效果

          • MYSQLI_STORE_RESULT_COPY_DATA 不再有效果

          • PDO::ATTR_STRINGIFY_FETCHES

             現(xiàn)在也適用于布爾值

          • 當(dāng)使用模擬的準(zhǔn)備語句時(shí),PDO MySQL 和 Sqlite 結(jié)果集中的整數(shù)和浮點(diǎn)數(shù)將使用原生 PHP 類型而不是字符串返回

          • htmlspecialcharshtmlentities現(xiàn)在這樣的函數(shù)也'默認(rèn)轉(zhuǎn)義為&#039;; 格式錯(cuò)誤的 UTF-8 也將被替換為 unicode 字符,而不是導(dǎo)致空字符串

          • hashhash_filehash_init增加了一個(gè)額外的參數(shù)給他們所謂的$options,它有一個(gè)默認(rèn)值[],這樣就不會(huì)影響到你的代碼

          • MurmurHash3和的新支持xxHash


          PHP 8.1 的更新還有很多,公眾號篇幅有限我也不一一講解了,主要是排版太痛苦了[Doge],不過現(xiàn)在 PHP 也開始往強(qiáng)類型和協(xié)程方向迭代,還是挺值得期待的。


          END

          如果覺得文章不錯(cuò)歡迎點(diǎn)贊和轉(zhuǎn)發(fā),關(guān)注本公眾號不定期推送PHP技術(shù)文章。

          瀏覽 159
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美操逼图片 | a√在线看 | 成人污污 | 大美女人人操人人摸 | 日日AⅤ|