99久久国产露脸精品麻豆,欧美日韩精品小说,亚洲免费在线美女视频,国产三级中文字幕,91极品国产情侣高潮对白,国产亚洲一区二区三区不卡片,欧美jizz精品欧美性,久久国产精品久久国产片

PHP8 新特性總結(jié)(一)

袁志蒙 3318次瀏覽

摘要:PHP8已經(jīng)正式發(fā)布3個多月了,這對PHP來說是一個重大版本,這個版本中有很多新功能,例如聯(lián)合類型、命名參數(shù)、Match表達式、Nullsafe空安全運算符、類的反射...

PHP8已經(jīng)正式發(fā)布3個多月了,本想早早研究一下新版本的特性,不過近期太忙了,這幾天才抽空研究了一下。

由于重大更改,您需要在代碼中進行一些更改才能在 PHP8 中運行。但是,如果您已經(jīng)跟上最新版本,升級應(yīng)該不會太難,因為大多數(shù)重大更改以前在 PHP7 版本中已棄用。

1.聯(lián)合類型

考慮到 PHP 動態(tài)語言類型的特性,現(xiàn)在很多情況下,聯(lián)合類型都是很有用的。聯(lián)合類型是兩個或者多個類型的集合,表示可以使用其中任何一個類型。

function show(int|string $a):int|string{
	var_dump($a);
	return 5;
}
echo show('yzmcms');


請注意,聯(lián)合類型中不包含void,因為void表示的含義是 “根本沒有返回值”,另外PHP7.1支持了null類型,但已被PHP8中的?代替,例如:

//PHP7中的寫法
function show(string|null $a){
	var_dump($a);
}

//PHP8中的寫法:
function show(?string $a){
	var_dump($a);
}


2.命名參數(shù)

命名參數(shù)允許您通過指定值名稱將值傳遞給函數(shù),這樣您就不必考慮它們的順序,還可以跳過可選參數(shù)!

function foo(string $a, string $b, ?string $c = null, ?string $d = null) 
{ 
	var_dump($a);
	var_dump($b);
	var_dump($d);
}
 
foo(
    b: 'value b', 
    a: 'value a', 
    d: 'value d',
);


3.Match表達式

與switch比較類似,你可以稱它為switch表達式的大哥:match可以返回值,不需要break語句,可以組合條件,使用嚴(yán)格的類型比較,并且不執(zhí)行任何類型的強制。

PHP7中的寫法:

$statusCode = 500;

switch ($statusCode) {
    case 200:
    case 300:
        $message = null;
        break;
    case 400:
        $message = 'not found';
        break;
    case 500:
        $message = 'server error';
        break;
    default:
        $message = 'unknown status code';
        break;
}

var_dump($message);  //server error


PHP8中的寫法:

$statusCode = 500;
$message = match ($statusCode) {
    200, 300 => null,
    400 => 'not found',
    500 => 'server error',
    default => 'unknown status code',
};

var_dump($message);  //server error


4. 構(gòu)造函數(shù)屬性提升

PHP7中的寫法:

class user{
    public string $name;

    public string $email;


    public function __construct(string $name, string $email) {
        $this->name = $name;
        $this->email = $email;
    }

    public function get_attribute(){
    	var_dump($this->name);
    	var_dump($this->email);
    }
}

$test = new user('yuanzhimeng', 'yzmcms@qq.com');
$test->get_attribute();


PHP8中的寫法:

class user{

    public function __construct(public string $name, public string $email) {

    }

    public function get_attribute(){
    	var_dump($this->name);
    	var_dump($this->email);
    }
}

$test = new user('yuanzhimeng', 'yzmcms@qq.com');
$test->get_attribute();


5.Nullsafe空安全運算符

常用于類中屬性和方法返回值.

?->

如果全等于NULL則斷開并返回NULL,如果不全等于NULL則往后繼續(xù)執(zhí)行,這個特性會非常高效的解決代碼的冗余。


在PHP7中,有時會存在類屬性多條件的判斷,如下代碼:

class Person{

    public $user;
    public $country;

    public function __construct(){
        $this->user = $this;
        $this->country='yes';
    }

    public function getAddress(){
        return $this;
    }
}

$session=new Person();

if($session!==null){
    $user = $session->user;

    if($user!==null){
        $address = $user->getAddress();

        if($address!=null){
            $country = $address->country;

            if($country!==null){
                var_dump($country);
            }
        }
    }
}


以上代碼返回結(jié)果為string(3) "yes"

但是在PHP8中就完美的解決了這種代碼冗余的問題:

class Person{

    public $user;
    public $country;

    public function __construct(){
        $this->user = $this;
        $this->country='yes';
    }

    public function getAddress(){
        return $this;
    }
}

$session=new Person();

echo $session?->user?->getAddress()?->country;


6. Reflection反射

反射類的 3 個方法簽名已變更:

ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);

現(xiàn)在已變成:

ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);

升級指南指定,如果要擴展這些類,并且仍想同時支持 PHP 7 和 PHP 8,則允許以下簽名:

ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);


7.注釋

方法注釋使用:

/**
 * this is show function
 */
function show($name)
{
	echo $name;
}


類注解類使用:

$ref = new ReflectionFunction("show");
echo $doc = $ref->getDocComment();

#[Attribute(Attribute::TARGET_CLASS)]
class MyAttr{
    public function __construct($name, $value) {
    	echo "$name,$value";
    }
}

#[MyAttr("api","http://www.yzmcms.com/api")]
class Person{}

$ref = new ReflectionClass("Person");
$ref->getAttributes("MyAttr")[0]->newInstance();


隨機內(nèi)容

表情

共2條評論
  • 網(wǎng)友評論:

    學(xué)到了學(xué)到了

    2021-04-08 20:30:27 回復(fù)

    點擊加載
  • 網(wǎng)友評論:

    滿滿的干貨,收藏了

    2021-03-20 21:17:45 回復(fù)

    點擊加載