Những thay đổi trong PHP 8

PHP 8 dự kiến chính thức ra mắt vào 26/11/2020 với nhiều thay đổi khi có thêm nhiều chức năng mới, cũng như có những cải thiện về hiệu năng. Cùng điểm qua một số thay đổi trong PHP 8

1. Union types

  • Union types là tập hợp bao gồm 1 hoặc nhiều types(ngoại trừ Void) => data của bạn có kiểu dữ liệu nằm trong tập hợp đấy
public function foo(Foo|Bar $input): int|float;
  • nullable có thể biều diễn trong Union types như sau
public function foo(Foo|null $foo): void;

public function bar(?Bar $bar): void;  

2. The nullsafe operator

- Before Php 8 Để hiện thì date ta phải thực hiện check nếu không muốn bắn ra exeption

$startDate = $dateAsString = $booking->getStartDate();

$dateAsString = $startDate ? $startDate->asDateTimeString() : null;

Hoặc một số framework như Laravel có hỗ trợ phương thức optional để thực hiện nullsafe operator
- Php 8:

$dateAsString = $booking->getStartDate()?->asDateTimeString();

3.Match expression

  • Php 8 bạn có thể dùng match thay thế cho lệnh switch
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;
}
$message = match ($statusCode) {
    200, 300 => null,
    400 => 'not found',
    500 => 'server error',
    default => 'unknown status code',
};

4. Named arguments

  • Cho phép truyền data vào function mà không cần tuân theo thứ tự
function foo(string $a, string $b, ?string $c = null, ?string $d = null)  
{ /* … */ }

foo(  
    b: 'value b', 
    a: 'value a', 
    d: 'value d',
);

5. Constructor property promotion

Thay vì phải khai báo contructor and property như sau

class Money  
{
    public Currency $currency;

    public int $amount;

    public function __construct(
        Currency $currency,
        int $amount,
    ) {
        $this->currency = $currency;
        $this->amount = $amount;
    }
}

Php 8 làm nó gọn gàng và dễ nhìn hơn

class Money  
{
    public function __construct(
        public Currency $currency,
        public int $amount,
    ) {}
}

6. New static return type

class Foo  
{
    public function test(): static
    {
        return new static();
    }
}

7. New mixed type

  • mixed type bao gồm các kiểu sau:
array  
bool  
callable  
int  
float  
null  
object  
resource  
string  

8. Throw expression

  • Throw từ là 1 statement thành 1 expression
$triggerError = fn () => throw new MyError();

$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');

9. Inheritance with private methods

10. Allowing ::class on objects

  • cho phép gọi ::class thay vì get_class()
$foo = new Foo();

var_dump($foo::class);  

11. Non-capturing catches

  • Trước Php 8 khi tất cả exception được lưu vào 1 biến vào bạn phải khải báo biến để chứa exception mặc dù nhiều lúc không dùng đến
try {  
} catch (MySpecialException $exception) {
    Log::error("Something went wrong");
}

Với Php 8 có thể làm viết như sau nếu không cần dùng $exception

try {  
} catch (MySpecialException) {
    Log::error("Something went wrong");
}

12. Trailing comma in parameter lists

  • bạn có thể để thừa dấu phẩy ở cuối list param
public function(  
    string $parameterA,
    int $parameterB,
    Foo $objectfoo,
) {
    // …
}

13. Tạo DateTime objects từ interface

DateTime::createFromInterface(DateTimeInterface $other);

DateTimeImmutable::createFromInterface(DateTimeInterface $other);  

14. New str_contains() function

  • Dùng str_contains(return bool) thay cho strpos(return int) để kiểm tra một chuột chưa một chuỗi khác
if (strpos('string with lots of words', 'words') !== false) { /* … */ }  
if (str_contains('string with lots of words', 'words')) { /* … */ }  

15. New str_starts_with() and str_ends_with() functions

str_starts_with('haystack', 'hay'); // true  
str_ends_with('haystack', 'stack'); // true

16. Thay đổi Abstract methods khi sử dụng traits

trait Test {  
    abstract public function test(int $input): int;
}

Trước Php 8:

class UsesTrait  
{
    use Test;

    public function test($input)
    {
        return $input;
    }
}

Php 8:

class UsesTrait  
{
    use Test;

    public function test(int $input): int
    {
        return $input;
    }
}

17. Concatenation precedence

echo "sum: " . $a + $b;  

- Trước Php 8: biểu thức trên sẽ được hiểu là:

echo ("sum: " . $a) + $b;  

- Php 8

echo "sum: " . ($a + $b);  

18. Attributes

  • Cho phép thêm meta data cho class mà không cần sử dụng docblocks
use App\Attributes\ExampleAttribute;

@@ExampleAttribute
class Foo  
{
    @@ExampleAttribute
    public const FOO = 'foo';

    @@ExampleAttribute
    public $x;

    @@ExampleAttribute
    public function foo(@@ExampleAttribute $bar) { }
}
@@Attribute
class ExampleAttribute  
{
    public $value;

    public function __construct($value)
    {
        $this->value = $value;
    }
}

Tham khảo : https://stitcher.io/blog/new-in-php-8

Related article