Hướng dẫn php enum could not be converted to string - php enum không thể chuyển đổi thành chuỗi

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 php enum could not be converted to string - php enum không thể chuyển đổi thành chuỗi

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ư

abstract class SaveKlinesFromApiQueue
{
    public const DEFAULT = 'save_klines_from_api_queue';
    public const PRIORITY = 'save_klines_from_api_priority_queue';
}
0 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;

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

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';
}
2

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

Hướng dẫn php enum could not be converted to string - php enum không thể chuyển đổi thành chuỗi

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';
}
3.

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

Sự mô tả

Mã sau:


class EnumTest extends Unit
{
    public function testArrayIntersect(): void
    {
        $array1 = [TestEnum::TEST];
        $array2 = [TestEnum::TEST];

        $actual = \array_intersect($array1, $array2);
        self::assertCount(1, $actual);
    }
}

enum TestEnum {
    case TEST;
}

Dẫn đến đầu ra này:

Object of class TestEnum could not be converted to string

Nhưng tôi dự kiến ​​bài kiểm tra sẽ vượt qua và nội bộ \ mảng_intersect để có thể làm việc với các enum. Điều tương tự cũng xảy ra với \ mảng_diff, vì vậy hầu hết các chức năng mảng khác cũng vậy
The same goes for \array_diff as well, so most probably other array functions, too

Phiên bản PHP

Php 8.1.0

Hệ điều hành

php:8.1-fpm-buster

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.