Π’Ρ€Π΅ΠΉΡ‚Ρ‹

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅ΠΉΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π΅Π΄ΡƒΡ‚ сСбя Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² классС. ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… (use) Π² пСрСчислСниС Ρ‚Ρ€Π΅ΠΉΡ‚Π°Ρ… нСльзя ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ свойства. Π’ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΌ Π² пСрСчислСниС Ρ‚Ρ€Π΅ΠΉΡ‚Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ константы. Π’Ρ€Π΅ΠΉΡ‚ со свойствами Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

<?php

interface Colorful
{
public function
color(): string;
}

trait
Rectangle
{
public function
shape(): string
{
return
"ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ";
}
}

enum
Suit implements Colorful
{
use
Rectangle;

case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;

public function
color(): string
{
return match (
$this) {
Suit::Hearts, Suit::Diamonds => 'ΠšΡ€Π°ΡΠ½Ρ‹ΠΉ',
Suit::Clubs, Suit::Spades => 'Π§Ρ‘Ρ€Π½Ρ‹ΠΉ',
};
}
}

$suit = Suit::Spades;
var_dump($suit->color());
var_dump($suit->shape());
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 1 note

up
31
wervin at mail dot com ΒΆ
2 years ago
One good example of a trait, would be to give a lot of enums a method to retrieve their cases, values or both.

<?php
trait EnumToArray
{
    public static function names(): array
    {
        return array_column(self::cases(), 'name');
        
    }

    public static function values(): array
    {
        return array_column(self::cases(), 'value');
    }

    public static function asArray(): array
    {
        if (empty(self::values())) {
            return self::names();
        }
        
        if (empty(self::names())) {
            return self::values();
        }
        
        return array_column(self::cases(), 'value', 'name');
    }
}
?>

Some example outputs:

<?php
var_export(IpVersion::names());     // ['Ipv4', 'IPv6']
var_export(IpVersion::values());    // []
var_export(IpVersion::asArray());   // ['IPv4', 'IPv6']

var_export(Language::names());      // ['en', 'es']
var_export(Language::values());     // ['English', 'Spanish']
var_export(Language::asArray());    // ['en' => 'English', 'es' => 'Spanish']