PHP 8.4.6 Released!

- Sayılamalar neden genişletilemez?

Sınıfların yöntemleri üzerinde sözleşmeleri vardır:

<?php

class A {}
class
B extends A {}

function
foo(A $a) {}

function
bar(B $b) {
foo($b);
}
?>

Bu kod tür açısından güvenlidir, çünkü B, A'nın sözleşmesini takip eder ve az/çok-özgüllüğün büyüsü aracılığıyla, istisnalar dışında, yöntemlerden beklentiler korunur.

Sayılamalar yöntemlerle değil kılıflarla yönetilir:

<?php

enum ErrorCode {
case
SOMETHING_BROKE;
}

function
quux(ErrorCode $errorCode)
{
/ Bu kod tüm kılıfları kapsıyor gibi görünüyor
match ($errorCode) {
ErrorCode::SOMETHING_BROKE => true,
}
}

?>

quux işlevindeki match deyimi, ErrorCode sayılamasındaki tüm kılıfları kapsayacak şekilde statik olarak incelenebilir.

Ancak, sayılamaların genişletilmesine izin verildiği varsayılırsa:

<?php

/ Sayılamaların değişmez olmadığı deneysel kod.
/ Dikkat, bu kod aslında PHP'de çalışmaz.
enum MoreErrorCode extends ErrorCode {
case
PEBKAC;
}

function
fot(MoreErrorCode $errorCode) {
quux($errorCode);
}

fot(MoreErrorCode::PEBKAC);

?>

Normal kalıtım kurallarına göre, diğerini genişleten bir sınıf tür denetimini geçecektir.

quux() içindeki match deyiminin artık tüm kılıfları kapsamaması sorun olur. MoreErrorCode::PEBKAC hakkında bilgisi olmadığı için match deyimi bir istisna oluşturur.

Bu nedenle sayılamalar değişmezdir ve genişletilemez.

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top

Follow Lee on X/Twitter - Father, Husband, Serial builder creating AI, crypto, games & web tools. We are friends :) AI Will Come To Life!

Check out: eBank.nz (Art Generator) | Netwrck.com (AI Tools) | Text-Generator.io (AI API) | BitBank.nz (Crypto AI) | ReadingTime (Kids Reading) | RewordGame | BigMultiplayerChess | WebFiddle | How.nz | Helix AI Assistant