PHP 8突破性變化

新的PHP首要版別PHP8估計將於2020年底發佈。
  它現在正處於十分活潑的開發中,所以在接下來的幾個月裏,開發速度和開發進程或許會有很大的改動。
  在這篇文章中,我會羅列出PHP8中會發作的一些改動:新功能、性能改善和突破性改動。
  由於PHP8是一個新的首要版別,所以代碼及語法向下兼容性會更低。
  假如您一向堅持與最新版別堅持同步,那麼升級應該不會太難,由於大多數突破性的更改在7.*版別中都已棄用。
  除了突破性的改動,PHP8還帶來了一些不錯的新特性,比方JIT編譯器和uniontypes,當然還有其它更多的特性。
  新特性
  從新特性開端說起,可是PHP8仍在積極開發中,因而這個清單將跟着時間的推移而增長。
  聯合類型(Uniontypes)RFC
  考慮到PHP的動態類型特性,聯合類型在許多情況下都很有用。
  聯合類型是兩個或多個類型的調集,這些類型指示能夠運用這兩個類型中的任何一個。
  1
  publicfunctionfoo(Foo|Barinput):intfloat;  C  void  NULL  publicfunctionfoo(Foonullinput):int|float;   我怎麼感覺這個和C語言裏的聯合體有點類似。   請注意,void永遠不能是聯合類型的一部分,由於它表明“根本沒有回來值”。   此外,能夠運用|NULL或運用現有的?。   publicfunctionfoo(Foo|nullfoo):void;
  publicfunctionbar(?BarKaTeX parse error: Expected '}', got 'EOF' at end of input: … privateWeakMapcache;
  publicfunctiongetSomethingWithCaching(objectKaTeX parse error: Expected '}', got 'EOF' at end of input: …ct   {   returnthis->cache[obj]  ??=obj]   ??=this->computeSomethingExpensive(KaTeX parse error: Expected 'EOF', got '}' at position 9: obj);   }̲   }   能夠在目標上運用…foo=newFoo();
  var_dump(foo::class);  DateTime  DateTimecreateFromImmutable(foo::class);   創立DateTime目標的接口   您現已能夠運用DateTime::createFromImmutable(immutableDateTime),從DateTimeImmutable目標創立DateTime目標,可是反過來很棘手。
  通過添加DateTime::createFromInterface()和DatetimeImmutable::createFromInterface(),現在有了一種將DateTime和DateTimeImmutable目標彼此轉化的通用辦法。
  DateTime::createFromInterface(DateTimeInterfaceother);  DateTimeImmutable::createFromInterface(DateTimeInterfaceother);   DateTimeImmutable::createFromInterface(DateTimeInterfaceother);
  新的Stringable接口RFC
  Stringable接口可用於鍵入提示任何字符串或完成__toString()。
  此外,每逢類完成__toString()時,它都會自動在幕後完成接口,不需要手動完成它。
  classFoo
  {
  publicfunction__toString():string
  {
  return’foo’;
  }
  }
  functionbar(StringableKaTeX parse error: Undefined control sequence: \foo at position 483: …更有用的輸出。   例如,在類\̲f̲o̲o̲\Bar上調用gettype(…input):int;
  }
  classUsesTrait
  {
  useTest;
  publicfunctiontest(KaTeX parse error: Expected '}', got 'EOF' at end of input: …t)   {   returninput;
  }
  }
  在運用traits並完成其籠統辦法時,PHP8將執行正確的辦法簽名驗證。
  這意味着您需要改寫以下內容:
  classUsesTrait
  {
  useTest;
  publicfunctiontest(intKaTeX parse error: Expected '}', got 'EOF' at end of input: …nt   {   returninput;
  }
  }
  token_get_all()的目標接口RFC
  函數的效果是:回來值的是一個數組。
  此RFC運用PhpToken::getall()辦法添加一個PhpToken類。
  此完成運用目標,而不是一般值。
  它消耗更少的內存,更簡單閱讀。
  變量語法調整RFC
  來自RFC:“統一變量語法RFC處理了PHP變量語法中的一些不一致問題”,這個RFC打算處理少數被疏忽的情況。
  內部函數的類型批註
  許多人都參加到爲一切內部函數添加適當類型註釋的工作中。
  這是一個長期存在的問題,通過在曾經版別中對PHP所做的一切更改,終究能夠處理這個問題。
  這意味着內部函數和辦法在反射中將具有完好的類型信息。
  統一過錯類型RFC
  PHP中的用戶界說函數現已拋出TypeErrors,可是內部函數沒有拋出TypeErrors,而是宣佈正告並回來NULL。
  從PHP8開端,內部函數的行爲現已堅持一致。
  從頭分類zendengine報錯RFC
  許多曾經只觸發正告或告訴的過錯已轉化爲適當的過錯。
  以下正告已更改。
  未界說變量:過錯反常而不是告訴。
  未界說的數組索引:正告而不是告訴。
  被零除:DivisionByZeroError反常而不是正告。
  測驗遞加/遞減非目標的特點‘%s’:過錯反常而不是正告。
  企圖修正非目標的特點‘%s’:過錯反常而不是正告。
  測驗分配非目標的特點‘%s’:過錯反常而不是正告。
  從空值創立默認目標:過錯反常而不是正告。
  正在測驗獲取非目標的特點‘%s’:正告而不是告訴。
  未界說特點:%s::KaTeX parse error: Expected 'EOF', got '#' at position 297: …正告而不是告訴。   資源ID#̲%d用作偏移量,轉化爲整數(%…a+b;  PHP  echo("sum:".b;   PHP曾經會這樣解說它:   echo("sum:".a)+b;  PHP8  echo"sum:".(b;   PHP8將會這樣解說它:   echo"sum:".(a+b);      ReflectionClass::newInstance(b);   反射辦法簽名更改   反射類的三個辦法簽名已更改:   ReflectionClass::newInstance(args);
  ReflectionFunction::invoke(args);  ReflectionMethod::invoke(args);   ReflectionMethod::invoke(object,args);    ReflectionClass::newInstance(...args);   現已成爲:   ReflectionClass::newInstance(...args);
  ReflectionFunction::invoke(…args);  ReflectionMethod::invoke(args);   ReflectionMethod::invoke(object,…args);  PHP7PHP8  ReflectionClass::newInstance(args);   升級攻略指定,假如您擴展了這些類,而且依然希望同時支撐PHP7和PHP8,則答應以下簽名:   ReflectionClass::newInstance(arg=null,…args);  ReflectionFunction::invoke(args);   ReflectionFunction::invoke(arg=null,…args);  ReflectionMethod::invoke(args);   ReflectionMethod::invoke(object,arg=null,...arg=null,...args);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章