Bir Fabrikası'nda Çoklu Sınıf İşlemleri Taşıma

2 Cevap php

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.

2 Cevap

Muhtemelen bir proxy sınıf ya da ihtiyacınız olduğunda hata işleyicisi almak için sağlayacak bir singleton olan en iyi. Gibi bir şey:

class ErrorHandler {
    private static $_instance = null;
    public static function getInstance()
    {
         if (null !== self::$_instance) {
              self::$_instance = new ErrorHandler;
         }
         return self::$_instance;
    }

    public static function setInstance(ErrorHandler $instance)
    {
         $oldInstance = self::$_instance;
         self::$_instance = $instance;
         return $oldInstance;
    }
}

Bu, her zaman (Hataİşleyici yoluyla :: getInstance ()) Hataİşleyici tek bir örneğini size gerektiğinde ve aynı zamanda küresel etkin bir örneği değiştirmek toplamak için izin verecek (Hataİşleyici yoluyla :: setInstance ()).

Sen Verilen örneğin işleyicisi ve bilgilendiricisini hem de içeren standart bir nesneyi döndürmek için () createErrorNotifier değiştirebilir. Sonra alıcılar ve yeni bir Notifier ile bir işleyici karıştırma konusunda endişelenmenize gerek olmayacaktır. Örneğin, aşağıdaki değişiklikleri deneyin:

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 (object)array(
        'notifier' => $errorNotifier,
        'handler' => $errorHandler,
    );

}

Eğer createErrorNotifier çağırdığınızda Sonra, belirli bir örnek için işleyici ve bilgilendiricisini hem erişebilir:

$not1 = $obj->createErrorNotifier(...);
var_dump($not1->notifier, $not1->handler);

Bu yardımcı olur umarım!