Hướng dẫn convert string to enum php - chuyển đổi chuỗi thành enum php

Tôi tự hỏi tại sao không thể cung cấp triển khai __toString cho Enum.

IDE nói rằng "enum có thể không bao gồm '__tostring'". Tuy nhiên, đó là điều đầu tiên tôi nghĩ về một khi tôi đã tạo ra Enum. Trước đây tôi đã sử dụng các đối tượng giá trị đóng gói các chuỗi trong mã của mình, sử dụng quá trình đúc chuỗi khi cần thiết. Bây giờ tôi muốn di chuyển chúng vào các enums, nhưng những người đó chống lại.

#[Immutable]
enum SaveKlinesFromApiQueue: string
{
    case DEFAULT = 'save_klines_from_api_queue';
    case PRIORITY = 'save_klines_from_api_priority_queue';

    public function __toString(): string
    {
        return $this->value;
    }
}

Hỏi ngày 5 tháng 12 năm 2021 lúc 15:25Dec 5, 2021 at 15:25

Hướng dẫn convert string to enum php - chuyển đổi chuỗi thành enum php

6

Tôi nghĩ rằng bạn không nên sử dụng Enum nếu bạn muốn sử dụng nó như const trong một lớp học thông thường. Cân nhắc việc tạo một lớp trừu tượng thay vì như thế này:

abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}

Ngoài việc sử dụng đúng enum, trong trường hợp của bạn, bạn có thể sử dụng:

echo SaveKlinesFromApiQueue::DEFAULT->name;

Result: "DEFAULT"

hoặc

echo SaveKlinesFromApiQueue::DEFAULT->value;

abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
0

Đã trả lời ngày 14 tháng 7 lúc 13:52Jul 14 at 13:52

Hướng dẫn convert string to enum php - chuyển đổi chuỗi thành enum php

Như Chris đề cập, các phương pháp ma thuật không được phép.

Đối với 2 (?)

Để có được giá trị chuỗi của một duy nhất, bạn chỉ có thể sử dụng

abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
1.

Nếu bạn muốn các giá trị chuỗi của tất cả chúng, chỉ cần thêm một vòng lặp trong một phương thức:

    public static function strings(): array
    {
        $strings = [];
        foreach(self::cases() as $case) {
            $strings[] = $case->value;
        }
        return $strings;
    }

Đã trả lời ngày 7 tháng 2 lúc 22:02Feb 7 at 22:02

Puggan Sepuggan SEPuggan Se

5.6402 Huy hiệu vàng23 Huy hiệu bạc46 Huy hiệu đồng2 gold badges23 silver badges46 bronze badges

1

Đối với các giá trị đơn giản, sử dụng "const" thay vì "trường hợp":

enum SaveKlinesFromApiQueue: string {
    const DEFAULT = 'save_klines_from_api_queue';
    const PRIORITY = 'save_klines_from_api_priority_queue';
}

echo SaveKlinesFromApiQueue::DEFAULT;

Đã trả lời ngày 7 tháng 10 lúc 14:34Oct 7 at 14:34

Việc thực hiện các công việc của Jsonserializable nếu trường hợp sử dụng của bạn liên quan đến việc chuyển đổi thuộc tính Enum thành JSON.

enum ParameterTypeEnum implements \JsonSerializable
{
    case QUERY;
    case COOKIE;
    case HEADER;
    case PATH;

    public function getType(): string
    {
        return match($this) {
            ParameterTypeEnum::QUERY => 'query',
            ParameterTypeEnum::COOKIE => 'cookie',
            ParameterTypeEnum::HEADER => 'header',
            ParameterTypeEnum::PATH => 'path',
        };
    }

    public function jsonSerialize(): mixed
    {
        return $this->getType();
    }
}

Đã trả lời ngày 10 tháng 6 lúc 22:38Jun 10 at 22:38

Cnizzardinicnizzardinicnizzardini

1.1671 Huy hiệu vàng13 Huy hiệu bạc26 Huy hiệu đồng1 gold badge13 silver badges26 bronze badges

2

Theo mặc định, các trường hợp được liệt kê không có vô hướng tương đương. Chúng chỉ đơn giản là các đối tượng singleton. Tuy nhiên, có rất nhiều trường hợp trong trường hợp được liệt kê cần có khả năng chuyến đi khứ hồi đến cơ sở dữ liệu hoặc kho dữ liệu tương tự, do đó, có một vô hướng tích hợp (và do đó có thể nối tiếp một cách tầm thường) được xác định nội tại được xác định là hữu ích.

Để xác định tương đương vô hướng cho một liệt kê, cú pháp như sau:

abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
2

Một trường hợp có tương đương vô hướng được gọi là trường hợp được hỗ trợ, vì nó được "hỗ trợ" bởi một giá trị đơn giản hơn. Một enum chứa tất cả các trường hợp được hỗ trợ được gọi là "enum được hỗ trợ". Một enum được hỗ trợ có thể chỉ chứa các trường hợp được hỗ trợ. Một enum thuần túy có thể chỉ chứa các trường hợp thuần túy.

Một enum được hỗ trợ có thể được hỗ trợ bởi các loại

abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
3 hoặc
abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
4 và một bảng liệt kê nhất định chỉ hỗ trợ một loại tại một thời điểm (nghĩa là không có sự kết hợp của
abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
5). Nếu một bảng liệt kê được đánh dấu là có tương đương vô hướng, thì tất cả các trường hợp phải có một vô hướng duy nhất được xác định rõ ràng. Không có các tương đương vô hướng do tự động tạo ra (ví dụ: số nguyên tuần tự). Các trường hợp được hỗ trợ phải là duy nhất; Hai trường hợp enum được hỗ trợ có thể không có cùng một vô hướng tương đương. Tuy nhiên, một hằng số có thể đề cập đến một trường hợp, tạo ra một bí danh một cách hiệu quả. Xem hằng số liệt kê.

Các giá trị tương đương phải là nghĩa đen hoặc biểu thức theo nghĩa đen. Hằng số và biểu thức không đổi không được hỗ trợ. Đó là,

abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
6 được cho phép, nhưng
abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
7 thì không.

Các trường hợp được hỗ trợ có một thuộc tính chỉ đọc bổ sung,

abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
8, là giá trị được chỉ định trong định nghĩa.

abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
9

Để thực thi thuộc tính

abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
8 là chỉ đọc, một biến không thể được chỉ định làm tài liệu tham khảo cho nó. Đó là, sau đây đã đưa ra một lỗi:

echo SaveKlinesFromApiQueue::DEFAULT->name;
1

Các enum được hỗ trợ thực hiện giao diện Backedenum nội bộ, hiển thị hai phương pháp bổ sung:BackedEnum interface, which exposes two additional methods:

  • echo SaveKlinesFromApiQueue::DEFAULT->name;
    
    2 sẽ lấy vô hướng và trả lại trường hợp enum tương ứng. Nếu một người không được tìm thấy, nó sẽ ném một giá trịerror. Điều này chủ yếu hữu ích trong các trường hợp vô hướng đầu vào được tin cậy và giá trị ENUM bị thiếu nên được coi là lỗi dừng ứng dụng.ValueError. This is mainly useful in cases where the input scalar is trusted and a missing enum value should be considered an application-stopping error.
  • echo SaveKlinesFromApiQueue::DEFAULT->name;
    
    3 sẽ lấy vô hướng và trả lại trường hợp enum tương ứng. Nếu không tìm thấy, nó sẽ trả lại
    echo SaveKlinesFromApiQueue::DEFAULT->name;
    
    4. Điều này chủ yếu hữu ích trong các trường hợp vô hướng đầu vào không được tin tưởng và người gọi muốn thực hiện xử lý lỗi hoặc logic giá trị mặc định của riêng họ.

Các phương pháp

echo SaveKlinesFromApiQueue::DEFAULT->name;
5 và
echo SaveKlinesFromApiQueue::DEFAULT->name;
6 tuân theo các quy tắc đánh máy yếu/mạnh tiêu chuẩn. Trong chế độ đánh máy yếu, việc vượt qua một số nguyên hoặc chuỗi là chấp nhận được và hệ thống sẽ ép buộc giá trị tương ứng. Vượt qua một chiếc phao cũng sẽ hoạt động và bị ép buộc. Trong chế độ gõ nghiêm ngặt, chuyển số nguyên cho
echo SaveKlinesFromApiQueue::DEFAULT->name;
5 trên enum được hỗ trợ chuỗi (hoặc ngược lại) sẽ dẫn đến một kiểu mẫu, cũng như một sự nổi trong mọi trường hợp. Tất cả các loại tham số khác sẽ ném một kiểu mẫu trong cả hai chế độ.TypeError, as will a float in all circumstances. All other parameter types will throw a TypeError in both modes.

echo SaveKlinesFromApiQueue::DEFAULT->name;
8

Xác định thủ công một phương thức

echo SaveKlinesFromApiQueue::DEFAULT->name;
5 hoặc
echo SaveKlinesFromApiQueue::DEFAULT->name;
6 trên enum được hỗ trợ sẽ dẫn đến một lỗi nghiêm trọng.

Làm thế nào để sử dụng Enums trong Php 8. 1?

Enums giữ một giá trị, tức là một enum được hỗ trợ, phải:..
Tuyên bố loại vô hướng trong khai báo enum.Chỉ cho phép chuỗi hoặc int mới được phép ..
Gán giá trị cho tất cả các trường hợp ..
Giữ các giá trị của cùng loại vô hướng.Nó không được phép lưu trữ các giá trị chuỗi và int hỗn hợp ..
Các trường hợp và giá trị được gán là duy nhất ..

Enum trong PHP là gì?

Trong PHP, Enums là một loại đối tượng đặc biệt.Bản thân Enum là một lớp và các trường hợp có thể của nó là tất cả các đối tượng đơn lẻ của lớp đó.Điều đó có nghĩa là các trường hợp enum là các đối tượng hợp lệ và có thể được sử dụng ở bất cứ đâu mà một đối tượng có thể được sử dụng, bao gồm cả kiểm tra loại.a special kind of object. The Enum itself is a class, and its possible cases are all single-instance objects of that class. That means Enum cases are valid objects and may be used anywhere an object may be used, including type checks.

Chúng ta có thể chuyển đổi enum thành chuỗi không?

Chúng ta có thể chuyển đổi một enum thành chuỗi bằng cách gọi phương thức toString () của enum..