Sayılama Yöntemleri

Sayılamalar (destekli ve desteksiz, her ikiside) yöntemler içerebilir ve arayüzleri gerçekleyebilir. Bir sayılama, bir arayüzü gerçekliyorsa bu arayüz için her tür sınaması bu sayılamanın tüm sınıflarını kabul edecektir.

<?php

interface Renkli
{
public function
renk(): string;
}
enum
Deste implements Renkli
{
case
Kupalar;
case
Karolar;
case
Sinekler;
case
Maçalar;
// Arayüzle anlaşmayı sağlar.
public function renk(): string
{
return match(
$this) {
Deste::Kupalar, Deste::Karolar => 'Kırmızı',
Deste::Sinekler, Deste::Maçalar => 'Siyah',
};
}
// bir arayüzün parçası değil; ama geçerli.
public function kesim(): string
{
return
"Dörtgen";
}
}
function
boya(Renkli $c)
{
/* ... */
}

boya(Deste::Sinekler); // çalışır
print Deste::Karolar->kesim(); // "Dörtgen"
?>

Bu örnekte, dört Deste örneğinin hepsi iki yönteme sahiptir: renk() ve kesim(). Kod çağrılır çağrılmaz tür sınamaları yapılır. Bu, diğer nesne örneklerine uygulanandan farklı değildir.

Destekli sayılamada arayüz bildirimi, desteki tür bildiriminden sonra ele alınır.

<?php

interface Renkli
{
public function
renk(): string;
}
enum
Deste: string implements Renkli
{
case
Kupalar = 'Ku';
case
Karolar = 'Ka';
case
Sinekler = 'S';
case
Maçalar = 'M';
// arayüzle anlaşmayı sağlar
public function renk(): string
{
return match(
$this) {
Deste::Kupalar, Deste::Karolar => 'Kırmızı',
Deste::Sinekler, Deste::Maçalar => 'Siyah',
};
}
}
?>

Yöntemin içindeki $this değişkeni değer olarak kılıf örneği alır.

Yöntemler keyfi olarak karmaşık olabilir, ancak uygulamada, farklı durumlara farklı sonuçlar sağlamak için genellikle statik bir değer döner veya $this ile match ifadesine eşlenir.

Bu durumda, Kırmızı ve Siyah değerleriyle bir RenkliDeste Enum türü tanımlamak ve bunun yerine onu döndürmek daha iyi bir veri modelleme uygulaması olacaktır. Ancak bu, örneği daha da karmaşıklaştıracaktır.

Yukarıdaki hiyerarşi mantıksal olarak aşağıdaki sınıf yapısına benzer (bu, çalışan asıl kod olmasa da):

<?php

interface Renkli
{
public function
renk(): string;
}
final class
Deste implements UnitEnum, Renkli
{
public const
Kupalar = new self('Kupalar');
public const
Karolar = new self('Karolar');
public const
Sinekler = new self('Sinekler');
public const
Maçalar = new self('Maçalar');
private function
__construct(public readonly string $name) {}
public function
renk(): string
{
return match(
$this) {
Deste::Kupalar, Deste::Karolar => 'Kırmızı',
Deste::Sinekler, Deste::Maçalar => 'Siyah',
};
}
public function
kesim(): string
{
return
"Dörtgen";
}
public static function
cases(): array
{
// Geçersiz yöntem
// Bir Enum üzerinde cases() yöntemini geliştirici tanımlayamaz.
// "Değer listeleme" bölümüne bakınız.
}
}
?>

Yöntemler public, private veya protected olabilir, ancak uygulamada private ve protected kalıtıma izin verilmediğinden eşdeğerdir.

add a note

User Contributed Notes 1 note

up
7
iloveyii at yahoo dot com
8 months ago
Just to complete the function shape in the above neat example:

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

enum
Suit implements Colorful
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;

// Fulfills the interface contract.
public function color(): string
{
return match(
$this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}

// Not part of an interface; that's fine.
public function shape(): string
{
return match(
$this) {
Suit::Hearts => '❤️',
Suit::Diamonds => '💎',
Suit::Clubs => '♣️',
Suit::Spades => ' ♠️'
};

}
}

echo
Suit::Diamonds->shape();
echo
PHP_EOL;
echo
Suit::Clubs->shape();
To Top