Hướng dẫn php fiber vs generator - php sợi so với máy phát điện

Hôm qua (26/11/2021), PHP 8.1 đã được release với một loạt các tính năng mới như: enum, read only roperty, fibers,... và cải thiệt rất nhiều về mặt hiệu năng.

Nội dung chính ShowShow

  • 1. Enumerations.
  • 2. Readonly Properties.
  • 3. First-class Callable.
  • 4. Initializers.
  • 5. Pure Intersection Type.
  • 6. Nerver return type.
  • 7. Final class constants.
  • 9. Array unpacking - hỗ trợ mảng bất tuần tự.
  • 10. Cải tiến về mặt hiệu năng.

Nội dung chính

  • 1. Enumerations.
  • 2. Readonly Properties.
  • 3. First-class Callable.
  • 4. Initializers.
  • 5. Pure Intersection Type.
  • 6. Nerver return type.
  • 7. Final class constants.
  • 9. Array unpacking - hỗ trợ mảng bất tuần tự.
  • 10. Cải tiến về mặt hiệu năng.

Nội dung chính

1. Enumerations.

Bài viết này mình sẽ liệu kê ra một số feature mới nổi bật trong PHP 8.1

Nếu như các bạn đã từng sử dụng các ngôn ngữ khác như:

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
4,
enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
5,... thì chắc hẳn các bạn cũng biết đến
enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
6 rồi.

Enum là một kiểu dữ liệu đặc biệt, enum chứa một tập hợp các hằng số được xác định trước. Thay vì các bạn phải khai báo các const trong class như trước thì bạn có thể khai báo chúng vào một enum cho dễ quản lí.: PHP < 8.1

class Status
{
    const DRAFT = 'draft';
    const PUBLISHED = 'published';
    const ARCHIVED = 'archived';
}

function acceptStatus(string $status) {...}

VD: PHP < 8.1

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}

Giờ đây từ PHP 8.1 trở đi bạn có thể đặt nó trong

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
6 như sau:

2. Readonly Properties.

3. First-class Callable.

4. Initializers.

5. Pure Intersection Type.: định nghĩa thuộc tính

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
9 là readonly.

class BlogData
{
    public readonly Status $status;
}

6. Nerver return type.

class BlogData
{
    public readonly Status $status;

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

3. First-class Callable.

4. Initializers.

5. Pure Intersection Type.: Đối với PHP < 8.1

class Foo
{
    public function bar(): string
    {
        return 'bar method';
    }
}

$bar = [new Foo(), 'bar'];

$bar(); // bar method

$fn = Closure::fromCallable('strlen');

$fn("ABC"); // 3

6. Nerver return type.

bar(...);

$bar(); // bar method

$fn = strlen(...);

$fn("ABC"); // 3

4. Initializers.

5. Pure Intersection Type.

VD::

class Service
{
    private Logger $logger;

    public function __construct(
        Logger $logger = new NullLogger(),
    ) {
        $this->logger = $logger;
    }
}

5. Pure Intersection Type.

6. Nerver return type.

7. Final class constants.: Đối với PHP < 8.1 nếu như chúng ta muốn parameter bắt buộc phải vừa implement Interator và Countable thì sẽ phải làm như sau:

function count_and_iterate(Iterator $value) {
    if (!($value instanceof Countable)) {
        throw new TypeError('value must be Countable');
    }

    foreach ($value as $val) {
        echo $val;
    }

    count($value);
}

9. Array unpacking - hỗ trợ mảng bất tuần tự.

VD::

function count_and_iterate(Iterator&Countable $value) {
    foreach ($value as $val) {
        echo $val;
    }

    count($value);
}

6. Nerver return type.

7. Final class constants.

9. Array unpacking - hỗ trợ mảng bất tuần tự.

10. Cải tiến về mặt hiệu năng.:

function redirect(string $uri): never {
    header('Location: ' . $uri);
    exit();
}

function redirectToLoginPage(): never {
    redirect('/login');
    echo 'Hello'; // Nếu khai báo như này thì code vẫn chạy nhưng các IDE inspector, static analysis sẽ báo lỗi
}

7. Final class constants.

9. Array unpacking - hỗ trợ mảng bất tuần tự.

10. Cải tiến về mặt hiệu năng.:

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
0

Nội dung chính

Bài viết này mình sẽ liệu kê ra một số feature mới nổi bật trong PHP 8.1

Nếu như các bạn đã từng sử dụng các ngôn ngữ khác như:

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
4,
enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
5,... thì chắc hẳn các bạn cũng biết đến
enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
6 rồi.

Enum là một kiểu dữ liệu đặc biệt, enum chứa một tập hợp các hằng số được xác định trước. Thay vì các bạn phải khai báo các const trong class như trước thì bạn có thể khai báo chúng vào một enum cho dễ quản lí.

VD: PHP < 8.1

Giờ đây từ PHP 8.1 trở đi bạn có thể đặt nó trong

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
6 như sau:: Mình sẽ demo một ví dụ cơ bản với fiber

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
1

Để hiểu rõ hơn về

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
6 trong PHP các bạn có thể tham khảo tại đây.

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
2

Ở phiên bản này PHP cung cấp thêm một loại thuộc tính chỉ được phép đọc mà không được phép ghi khi class đã được khởi tạo.

Nếu bạn muốn một thuộc tính chỉ được phép đọc thì chỉ cần thêm keyword readonly vào sau visibility của thuộc tính đó.

9. Array unpacking - hỗ trợ mảng bất tuần tự.

10. Cải tiến về mặt hiệu năng.

VD::

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}
3

10. Cải tiến về mặt hiệu năng.

Nội dung chính

Bài viết này mình sẽ liệu kê ra một số feature mới nổi bật trong PHP 8.1