參數以及返回值的類型如今能夠經過在類型前加上一個問號使之容許爲空。當啓用這個特性時,傳入的參數或者函數返回的結果要麼是給定的類型,要麼是nullphp
#php5 function($a = null){ if($a===null) { return null; } return $a; } #php7+ function fun() :?string { return null; } function fun1(?$a) { var_dump($a); } fun1(null);//null fun1('1');//1
返回值聲明爲 void 類型的方法要麼乾脆省去 return 語句。對於 void來講,NULL 不是一個合法的返回值。git
function fun() :void { echo "hello world"; }
class Something { const PUBLIC_CONST_A = 1; public const PUBLIC_CONST_B = 2; protected const PROTECTED_CONST = 3; private const PRIVATE_CONST = 4; }
這能夠被用在參數或者返回值類型中,它表明接受數組或者實現了Traversable接口的對象.github
function iterator(iterable $iter) { foreach ($iter as $val) { // } }
一個catch語句塊如今能夠經過管道字符(_|_)來實現多個異常的捕獲。 這對於須要同時處理來自不一樣類的不一樣異常時頗有用算法
try { // some code } catch (FirstException | SecondException $e) { // handle first and second exceptions }
$data = [ ["id" => 1, "name" => 'Tom'], ["id" => 2, "name" => 'Fred'], ]; // list() style list("id" => $id1, "name" => $name1) = $data[0]; var_dump($id1);//1
$a= "hello"; $a[-2];//l
Closure新增了一個靜態方法,用於將callable快速地 轉爲一個Closure 對象。json
<?php class Test { public function exposeFunction() { return Closure::fromCallable([$this, 'privateFunction']); } private function privateFunction($param) { var_dump($param); } } $privFunc = (new Test)->exposeFunction(); $privFunc('some value');
對http2服務器推送的支持如今已經被加入到 CURL 擴展數組
原文連接:https://cloud.tencent.com/dev...bash
這種新的對象類型,object
, 引進了可用於逆變(contravariant)參數輸入和協變(covariant)返回任何對象類型。服務器
<?php function test(object $obj) : object { return new SqlQueue(); } test(new Stdclass());
當一個抽象類繼承於另一個抽象類的時候,繼承後的抽象類能夠重寫被繼承的抽象類的抽象方法。php7
<?php abstract class A { abstract function test(string $s); } abstract class B extends A { abstract function test($s) : int; }
Argon2 已經被加入到密碼散列(password hashing) API (這些函數以 password_ 開頭), 如下是暴露出來的常量:閉包
PASSWORD_ARGON2I
PASSWORD_ARGON2_DEFAULT_MEMORY_COST
PASSWORD_ARGON2_DEFAULT_TIME_COST
PASSWORD_ARGON2_DEFAULT_THERADS
命名空間能夠在PHP 7中使用尾隨逗號進行分組引入。
<?php use Foo\Bar\{ Foo, Bar, Baz, };
06 Dec 2018
Heredoc
和Nowdoc
語法結束標記再也不須要獨立一行或緊跟分號了。同時結束標記也可使用縮進,使用縮進時doc內容的每行都會跳過相應的縮進。
$data = ["元素", <<<STR Doc Content The new line STR, 42,]; var_dump($data); array(3) { [0]=> string(6) "元素" [1]=> string(25) "Doc Content The new line" [2]=> int(42) }
以上語法中,Heredoc 做爲一個數組元素出現,同時結束標記沒有獨立在一行,還有縮進。注意定義的字符串內容,兩行的縮進都被剝除了。
演示:
$v = [10, 20]; [$a, &$b] = $v; $b += 10; var_dump($v, $a, $b); array(2) { [0]=> int(10) [1]=> &int(30) } int(10) int(30)
在爲 $b 解析時,使用了引用傳遞,此時 $b 和 $v[1] 元素保持引用關係。
演示:
$v = [10, 20]; list($c, &$d) = $v; $d += 10; var_dump($v, $c, $d); array(2) { [0]=> int(10) [1]=> &int(30) } int(10) int(30)
instanceof 的第一個運算數支持字面量,非對象型字面量檢測的結果爲 false。
var_dump("literal" instanceof stdClass); var_dump(42 instanceof stdClass); var_dump(new stdClass() instanceof stdClass); bool(false) bool(false) bool(true)
調用函數時,參數列表後容許跟隨一個逗號。
function methodName($p1, $p2) { // some statmenet var_dump($p1, $p2); } methodName(10, 20, ); int(10) int(20)
調用函數時,第二個(最後一個)參數後,增長了一個逗號是容許的。但定義是不行。
bcscale()
函數支持獲取當前BC函數所使用的 scale。
bcscale(3); var_dump(bcscale()); int(3)
LDAP:Lightweight Directory Access Protocol,輕量目錄訪問協議徹底支持。
增長了以下的選項來配置FPM的Logging:(暫未翻譯)
--with-password-argon2[=dir] 配置參數後。提供了對Password_*()函數中的 Argon2i 和 Argon2id 散列的支持。使用 PASSWORD_ARGON2ID 常量進行指定算法。PHP須要 libargon2 庫版本要大於(等於)20161029。
新的 CompileError 異常被添加,ParseError繼承了這個異常。目前只會影響 Token_GET_All() 在 Token_parse 模式下可能引起的編譯錯誤。
聽說 PHP7.3 比 PHP 7.0 快 22%。未測試,有機會壓測一下。
大小寫不敏感的常量聲明現已被廢棄。將 TRUE 做爲第三個參數傳遞給 define() 會致使一個廢棄警告。大小寫不敏感的使用(在讀取時使用一個與聲明時不一樣的大小寫方式)也已被廢棄。
將一個非字符串內容傳遞給字符串搜索函數。 在未來全部待搜索的內容都將被視爲字符串,而不是 ASCII 編碼值。若是須要依賴這個特性,你應該 要麼顯示地進行類型轉換(轉爲字符串),或者顯示地調用 chr()。 如下是受到影響的方法:
原文連接:https://zhuanlan.zhihu.com/p/...
預加載功能是指在服務啓動時,未運行任何應用程序代碼以前,將一組PHP文件加載到內存中,甚至能夠對框架進行預加載,以提升性能。若是對預加載代碼進行修改,須要重啓服務。
預加載相比opcache:opcache雖然解決了重複編譯問題,但opcache自己也有開銷。引用Dmitry Stogov大佬的話:
Not only. The idea is to completely eliminate compilation and opcache overhead (copying from SHM to process memory and insertions into function/class tables on each request). Using this technique, we might write standard functions and classes in PHP (similar to systemlib.php in HHVM).
預加載是徹底消除編譯和opcache所帶來的開銷(從共享內存複製到進程內存,並在每一個請求上插入到function/class表中),使用這種技術能夠在PHP中編寫標準函數和類(相似於HHVM中的systemlib.php)
想一想看,其實預加載主要是提高像php-fpm這種架構形式的性能,而且會佔用更多的內存資源。Benjamin Morel對預加載進行了測試。
https://github.com/composer/composer/issues/7777#issuecomment-440268416
經過修改php.ini中的opcache.preload
來選擇預加載程序。使用方法以下:
php.ini
[opcache] zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.preload=preload.php
preload.php
<?php function preload() { echo 'preload'; } opcache_compile_file('hello.php');
hello.php
<?php function hello() { echo 'hello'; }
test.php
<?php hello(); echo ' '; preload(); echo PHP_EOL;
運行
~$ php test.php hello preload
有時間咱們再聊,先佔上位置。
php版本<7.4:
<?php class User { /** @var int $id */ private $id; /** @var string $name */ public $name; }
php版本>=7.4:
<?php class User { private int $id; public string $name; }
一個完整的示例:
<?php class Example { // 支持除了「void」和「callable」以外的全部類型 public int $scalarType; protected ClassName $classType; private ?ClassName $nullableClassType; // 在靜態屬性中也是合法的 public static iterable $staticProp; // 也能夠與「var」一塊兒使用 var bool $flag; // 也可使用默認值 public string $str = "foo"; public ?string $nullableStr = null; // 在一次聲明多個屬性的狀況下,類型會做用於各屬性。 public float $x, $y; // 至關於這樣: public float $x; public float $y; }
如下是支持的全部類型:
bool, int, float, string, array, object iterable self, parent class interface // 任何 類名、接口名 ?type // 其中「type」能夠是以上任意一種類型
寫法:$a ??= 1 。其實就是 $a = $a ?? 1 的語法糖。
例子:
<?php $arr['a'] ??= 'a'; /*等同於*/ $arr['a'] = $arr['a'] ?? 'a'; $b ??= 'b'; /*等同於*/ $b = $b ?? 'b';
我相信大多數人和我同樣並不瞭解wddx,wddx是一個很「古老」的數據格式,基於xml(emmm,可能我理解的不是很對,大概其就是這個意思吧)。如今都在用json,因此棄用了也罷。有興趣的童鞋能夠看一下這篇文章。
https://blog.csdn.net/guoguo1980/article/details/2436342
此特性就是一個語法糖,相信你在別的語言中也見到過,下面是一些例子:
<?php $adder = fn($x, $y) => $x + $y; // 等同於 $adder = function ($x, $y) { return $x + $y; }; /*******************************/ $y = 1; $fn1 = function ($x) use ($y) { return $x + $y; }; // 等同於 $fn2 = fn($x) => $x + $y; // 新的寫法省去了 use, 變得更加簡潔
更多用法:
<?php fn(array $x) => $x; // 參數類型聲明 fn(): int => $x; // 返回類型聲明 fn($x = 42) => $x; // 參數默認值 fn(&$x) => $x; // 引用傳遞 fn&($x) => $x; // 引用返回 fn($x, ...$rest) => $rest; // 變長參數
其實我我的不是很贊同php引入那麼多語法糖,這使得php的語法變得愈來愈複雜,關於此rfc的投票,鳥哥選擇了反對,包括韓天峯大佬也對此特別反對,php應該回歸初心——簡單高效。
mb_str_split是mbstring擴展中新增的一個函數,經過函數名就能夠猜到,它是str_split函數的「加強版(多字節處理)」,它的做用和str_split同樣,都是將字符串拆分紅數組,只是增長了第三個參數,用於設置字符編碼。
說明:
mb_str_split ( string $string [, int $split_length = 1, string $encoding = mb_internal_encoding() ] ) : array
例子:
<?php print_r(mb_str_split("PHP是世界上最好的語言", 3)); // Array // ( // [0] => PHP // [1] => 是世界 // [2] => 上最好 // [3] => 的語言 // ) // 也能夠指定編碼 print_r(mb_str_split("PHP是世界上最好的語言", 3, "GB2312"));
從PHP7.4開始,Hash擴展是PHP核心擴展,沒法經過--disable-hash禁用,所以它始終可用。