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