Tür Dayatma ve PHP isteğe bağlı özellikler

2 Cevap php

Ben tarihleri ​​ile ilgilenen bir sınıf yöntemi var:

public function setAvailability(DateTime $start, DateTime $end){
}

Öğesi yer alt sınırını, üst sınırını, her ikisi veya hiçbiri olabilir bu yana, ben () de null değerleri kabul setAvailability yapmak istiyorum. Ancak, NULL sabit Tür Dayatma ihlal:

$foo->setAvailability(NULL, $end);

tetikler:

Catchable fatal error: Argument 1 passed to Foo::setAvailability() must be an instance of DateTime, null given

Ve bildiğim kadarıyla, hiçbir değere sahip bir DateTime örneği olamaz. (Can I?)

Ben kavramak edemez bir nedenle, bu iş gibi görünüyor:

public function setAvailability(DateTime $start=NULL, DateTime $end=NULL){
}
...
$foo->setAvailability(NULL, $end);

Ama saf şans çalışır kesmek gibi görünüyor.

Nasıl PHP sınıfları unset tarihleri ​​ile anlaşma olacak?

2 Cevap

Bu oldukça açıkça belirtilmiştir the PHP manual on typehinting:

Fonksiyonlar şimdi (PHP 5.1 'den beri) veya diziler (fonksiyon prototip sınıfın adını belirterek) nesneler parametreleri zorlamak mümkün. NULL varsayılan parametre değeri olarak kullanılır Ancak, herhangi bir sonraki çağrıya için bir argüman olarak izin verilecektir.

Parametresi null veya bir DateTime nesnesi olsaydı (if / else) bir kontrol olacak nesneleri Ürün içi gibi bana verdiğin örneği görünüyor. Ben DateTime uzanan örneğin bir özel DateTime, içine alıp Item nesnelerden bu sorumluluğu kaldırmak istiyorsunuz. Tarih veya değil 'zamanların başından beri' ise bu MyDateTime bilerek sorumlu olacaktır. Bunu yapmak Item için gerek yok.