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.