Bir tek sınıfını genişletme

5 Cevap php

ben böyle bir tekiz sınıfının bir örneğini oluşturmak için kullanılır:

$Singleton = SingletonClassName::GetInstance();

ve olmayan tekiz sınıf için:

$NonSingleton = new NonSingletonClassName;

i biz bu bir tek olup olmadığını bir sınıfın örneğini oluşturmak nasıl ayırt gerektiğini düşünüyorum. i diğer sınıf algısı bakarsanız, ben sınıf bir singleton sınıfı ya da gerek olmadığı umurumda değil. php bir singleton sınıfı tedavi nasıl yani, ben hala rahat değil. ben düşünüyorum ve ben her zaman yazmak istiyorum:

$Singleton = new SingletonClassName;

Bu soruna bir çözüm sadece olmayan başka bir tekil sınıf var mı?

5 Cevap

O (İnsanlar yeni bir tamamen yeni bir nesne anlamına gelir düşünüyorum) anlamak için çok daha zor kodunuzu yapar gibi ben bunu tavsiye etmem. Ama sonra Singletons kullanımını recoemmed olmaz.

Bu kodun temel fikir singleton etrafında sarıcı olmasıdır. Bu sargı aracılığıyla erişilen tüm fonksiyonlar ve değişkenler aslında tekiz etkilemektedir. Aşağıdaki kod sihirli yöntemler ve SPL arayüzleri bir sürü uygulamak değil gibi mükemmel değil ama gerekirse onlar eklenebilir

Code

/**
 * Superclass for a wrapper around a singleton implementation
 *
 * This class provides all the required functionality and avoids having to copy and
 * paste code for multiple singletons.
 */
class SingletonWrapper{
    private $_instance;
    /**
     * Ensures only derived classes can be constructed
     *
     * @param string $c The name of the singleton implementation class
     */
    protected function __construct($c){
        $this->_instance = &call_user_func(array($c, 'getInstance'));
    }
    public function __call($name, $args){
        call_user_func_array(array($this->_instance, $name), $args);
    }
    public function __get($name){
        return $this->_instance->{$name};
    }
    public function __set($name, $value){
        $this->_instance->{$name} = $value;
    }
}

/**
 * A test singleton implementation. This shouldn't be constructed and getInstance shouldn't
 * be used except by the MySingleton wrapper class.
 */
class MySingletonImpl{
    private static $instance = null;
    public function &getInstance(){
        if ( self::$instance === null ){
            self::$instance = new self();
        }
        return self::$instance;
    }

    //test functions
    public $foo = 1;
    public function bar(){
        static $var = 1;
        echo $var++;
    }
}

/**
 * A wrapper around the MySingletonImpl class
 */
class MySingleton extends SingletonWrapper{
    public function __construct(){
        parent::__construct('MySingletonImpl');
    }
}

Examples

$s1 = new MySingleton();
echo $s1->foo; //1
$s1->foo = 2;

$s2 = new MySingleton();
echo $s2->foo; //2

$s1->bar(); //1
$s2->bar(); //2

Daha iyi çevresinde başka bir yol - bir factory-method non-singletons sağlamak ve kullanma bunların örneklerini almak:

$NonSingleton = NonSingletonClassName::createInstance();

Bu ({[) (0]} olarak) Java için önerilen en iyi uygulama, ama çoğu nesne yönelimli diller için geçerlidir.

Bir Singleton düzenli bir sınıf örneği olarak aynı şekilde oluşturamazsınız. new her böylece halka açık olmayan yapıcı olması ve böylece sınıf içinde onu aramak için farklı bir yöntem olması, yeni bir örneğini döndürür.

Siz örneğin tüm sınıflar, fabrika yöntemleri olabilir Her zaman getInstance() başka bir yanıt gösterildiği gibi yapın. Başka bir seçenek Service Locator kullanmak olacaktır ve Dependency Injection Framework bu ne dönmek olmadığını bilir.

new anahtar kelime ne anlama dayanarak istediğiniz tüm ilgisizdir. O new :-) adlı neden new sınıfa yeni bir örneğini oluşturur, şu

Ben bu gerçekten eski bir yazı olduğunu biliyorum, ama aşağıdaki linke yardımıyla daha iyi Fabrikası desen anladım.

Eğer yardımcı olur Yani bir gelecek dolaştım. . . . buraya

http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/1/

Bu temel uygulanmasını kavramak ve anlamak için çok basit oldu.