Ben şu Fabrika Yöntemi var:
public function createErrorNotifier($verbose_output = false, $logging = false)
{
// First we get the handler
$errorHandler = $this->buildErrorHandler();
$errorNotifier = $this->buildErrorNotifier();
// We attach the notifier to the handler
$errorHandler->setCallback(array($errorNotifier, "throwException"));
// Return the Notifier
return $errorNotifier;
}
protected function buildErrorHandler()
{
return new ErrorHandler(error_reporting());
}
protected function buildErrorNotifier()
{
return new ErrorNotifier();
}
Basically, $errorHandler
is a class that, when it detects a PHP error, calls the
$errorNotifier->throwException()
function.
Sorun işlevi koştu ve sınıf kurulduktan sonra, ben vs, o / değiştirme özellikleri / erişim yöntemlerini kapatmak anlamına gelir ki, Hataİşleyici sınıfına erişimi yok olmasıdır
Bunu yapmak için en iyi yöntem Hataİşleyici, gibi bir şey kapmak için bir kamu erişimci yöntem sağlamaktır olacağını merak ediyorum:
public function buildErrorHandler()
{
if($this->handler == null)
{
$this->handler = new ErrorHandler();
}
return $this->handler;
}
Bu yöntem Fabrikası Hataİşleyici yeni bir örneğini oluşturmak için izin verecek, ve Hataİşleyici erişmek için dış kod sağlayacak. Ama sonra gidip başka ErrorNotifier oluşturmak istiyorsanız, ilk ben yeni nesneye geri arama yeniden atama olduğum gibi, çalışma duracaktır sorun haline çalıştırmak. Bu beklenmeyen bir davranış olurdu gibi, son derece kötü bir uygulama olacak gibi görünüyor bu.
Ben 'küresel' errorHandler her türlü ayarı bana ilki artık denilen olmayacak createErrorNotifier, aramak lazım olarak ikinci kez, aynı sorun üzerinde yolculuk neden olacak bir duygu var.
Belki bir çözüm yerine ErrorNotifier Hataİşleyici bir örneğini vermek için, ve sonra ErrorNotifier istemci ve Hataİşleyici arasında bir vekil olarak hareket edebilir olabilir? Gibi bir şey:
class ErrorNotifier{
public function __construct(ErrorHandler $handler)
{
$this->errorHandler = $handler;
$this->setCallback(array($this, "throwException"));
}
public function setCallback($callback)
{
$this->errorHandler->setCallback($callback);
}
}
Başka bir seçenek tamamen Hataİşleyici unutun olmak ve işleyicisi (set_exception_handler()
, ErrorhHandler, vb) çeşit ErrorNotifier bağlamak için istemci güveniyor olabilir.
Nasıl böyle bir şey işlemek? Ben sınıfların tasarımını değiştirerek karşı hiç değilim.
Temelde tüm şey '-olarak-yeniden değil' kılacak gibi, sadece iki sınıf birleştirilmesi çok dikkatli büyür. Ben (hatası ile ilgili) errorNotifier işlevlerinden errorHandler işlevselliği (bir hata oluştuğunda bir işlevi çağırarak) ayrı, ben o zaman çok daha kolay ikisi de yeniden kullanabilirsiniz.