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.