Yapıcı incelikle çıkmak mümkün mü?

6 Cevap php

Bu php bir kurucu dışarı incelikle çıkmak mümkün mü? Etkisi Something

class Foo { 

 function __construct()
 {

   $active = false;

   if(!$active)
   {
    return false;
   }

 }

}

Ben çalıştırmak bir yapılandırma dosyası dayalı olmalıdır sınıfındaki yöntemlerden herhangi olmadığını görmek için kontrol etmek istiyorum çünkü ben bunu gerçekleştirmek için çalışıyorum. Ben yöntemleri çalıştırıyor olmalıdır olmadığını görmek için her yöntemi yapılandırma dosyasını kontrol etmek zorunda istemiyorum.

6 Cevap

Yani "nazikçe" demek ne bağlıdır. Eğer yapıcı başarısız istiyorsanız bir istisna atabilir, ya da fabrika deseni kullanabilirsiniz:

class FooFactory {
    function makeFoo() {
        return $someConstraint ? null : new Foo();
    }
}

Belki bunu başarmak istediğinizi tam olarak ne üzerinde biraz ayrıntılı olabilir.

O kadar darbe yapmak. Bir kurucu zarif bir başarısızlık diye bir şey yoktur. Belki arama kodu, ancak yapıcı. Bir istisna ve bunu uygun tanıtıcı.

Ben yolunuzu gelen proxy desen kokusunu alabiliyorum. Ne başarmak için çalışıyoruz having the constructor fail gracefully ama not allowing methods to be called on an object based on some $active criterion değildir.

This doğru yönde bir işaret olabilir. Ya da belki (= >> oldukça sayfası gibi ben de bağlantılı değil, ama ben PHP için bulabildiğim en iyi) değildir. Da belki de diğer kaynaklardan, proxy bir okuma vermek etmeyin. Temelde, ProxyObject olacak execute methods bir real nesnesine bir başvuru olacaktır. real thing üzerine mesaj geçmek ya da olsun, real thing sanki istemci kod ProxyObject yöntemleri çağırmadan olacak ve ProxyObject aktif ya da değil karar verecek hiçbir şey ya da null veya kukla değerler döndürmek için. Iyi geliyor?

Lütfen yapıcı başarısız olursa, bir istisna olmalı, yanlış bir değer döndürmez. Eğer C gibi bir dil kullanmadığınız sürece hangi nesnenin yapımında istisnalar o deconstructed asla anlamına gelir.

Bir istisna onunla başa çıkmak için program zorlar, ve size kötü veri vermek, çünkü bunun nedeni budur. Bir değer dönerseniz, programı sessizce devam ve görmezden ne demek -1 veya o yolda daha sonra bir sorun neden olur kadar. Bir istisna atma kodunu girerek bu sessiz hataları önler. Sen düzgün inşa başarısız eğer false döndüren biliyor olabilir, ama co-işçi ve mutlulukla o gerçekten bir boolean olduğunu öğrenmek için inşa ne olduğunu düşündüm bir nesneyi kullanmayı deneyebilirsiniz olmayabilir.

Ben N3rd çok serin bir çözüm önerdi ama burada başka basit bir yöntem olduğunu düşünüyorum.

class Foo {

    private $active = TRUE;

    function __construct() {

    	$this->check ( $active ); 

            //OR
            //if ($this->check ( $active )) { do something } 
    }

    function check($var) {
    	if (! $var) {
    		$this->active = FALSE;
    		return FALSE;
    	}
    	return TRUE;

    }
}

If the constructor does so much logic, then it's not well designed. Leave it empty, pass the configuration to it via a setter method and let it fail there.

Bu OO programlama değil:

$o = new myObject();
if (!is_object($o)) // then what???