Php sonsuz özyineleme meseleyi çözmek

1 Cevap php

Şu anda sonsuz bir yineleme duruma çalıştırıyorum.

Ben gözlemci desen için oldukça benzer .. çeşitli nesne yöntemlerini çağıran bir mesaj servisini uygulayan ediyorum ..

Ne oluyor burada:

Dispatcher.php

class Dispatcher {
...
    public function message($name, $method) {

    // Find the object based on the name
    $object = $this->findObjectByName($name);

    if(!$object->decorations))
            // Decorate the object
        $object = new $name($object); // This is where it locks up.
            $object->decorations = true;
    }

    return $object->$method();
...
}

class A {
    function __construct()
    {
        $Dispatcher->message("B", "getName");
    }

    public function getName() {
        return "Class A";
    }

}

class B {
    function __construct()
    {
            // Assume $Dispatcher is the classes
        $Dispatcher->message("A", "getName");
    }

    public function getName() {
        return "Class B";
    }

}

Ne nesne başlatıldı zaman kilitleniyor. Sadece ileri ve geri birbirinden mesajın gider ve hiç kimse başlatılabilir.

Ben mesajları .. birbirleri için dönüş değerleri yine belirlenen olsun biri beklemek yapacak kuyruk uygulanması çeşit arıyorum. Ben mümkün olduğu kadar A sınıfı ve B sınıfı olarak az klişe kodu için arıyorum.


Ben not_initialized yöntemi hakkında konuşmak bir sürü alıyorum, ne yazık ki tartışma yanlış yönde gidiyor hissediyorum. Bu benim hatam, ben durum biraz daha anlatacağım (ve daha iyi umarım).

$object bir dekoratör desen uygular - ki ben mesajlaşma de süslemeler mevcuttur yapılan bu özellikleri kullanmak için gereken A sınıfı ve B sınıfı başlattığınızda $object daha fazla özellik (yöntemleri) gets olduğunu onun dekore henüz değilse, onu süslemek neden yöntem budur. Gerçekten sanmıyorum not_initialized sorunu olurdu, çünkü ne zaman söylemek $objectA henüz dekore değil kontrol edilir - Yani ona bu yöntemleri eklemek istiyorum. Sınıf A ve B dekoratör sınıflardır. Yani not_initialized zaman doğrudur. Ben nesneyi dekore deneyin zaman takılıyor. Ben daha bu durumu yansıtmak için kodu değişti.

1 Cevap

This is not an example of deadlock, but of endless recursion. Most likely your not_initialized function returns true until the constructor has been fully run. As a result, constructing an object of type A will indirectly call the B constructor, which will call the A constructor, ad infinitum.

Sen not_initialized işlevini değiştirmek zorunda, ya da eğer mesaj kurucular dışına sevk hareket edecek.

Deadlock çoklu süreçleri içeren bir durumdur. Bu durumda, sadece tek bir süreç vardır.