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.