Singleton deseni + __ PHP4'te inşa

2 Cevap php

To clarify:

  • hayır ben bu saf PHP5 yapamaz
  • evet bu kod PHP 4.3.9 çalışır.

Ben herhangi bir gerçek dünya deneyimi PHP4 uygulayan veya destek yok ama PHP4 ve PHP5 hem destekler böylece son zamanlarda benim sınıf değiştirmek zorunda kaldı.

  • Herkes burada kullanılan tekiz yöntemin benim uygulanması ile ilgili olası sorunları öngörebiliriz? Ben sadece bu sınıfın bir örneğini istiyorum.
  • Ben, ben tamamen __construct yöntemin kurtulmak gerektiğini biliyorum? (Ve Konf işlevi bunun fonksiyonu vücut hareket).
  • I self yerde kullanılmış olabilir? Ben onun PHP4 desteğinin emin değildi.


<?php

class Conf {
    function Conf( $filename ) {
    	$this->__construct( $filename );
    }

    function __construct( $filename ) {
    	echo $filename;
    }

    function getInstance( $filename ) {
    	static $instance = null;
    	if ( $instance == null ) {
    		$instance = new Conf( $filename );
    	}
    	return $instance;
    }
}

$x = Conf::getInstance( 'file.xml' );

2 Cevap

Kullanılamaması etrafında almak için self PHP4'te, aşağıdaki için getInstance yöntemini değiştirmek gerekir:

class Conf {
    function Conf( $filename ) {
    	$this->__construct( $filename );
    }

    function getInstance( $filename ) {
    	static $instance = null;
    	if ( $instance == null ) {
    		$class = __CLASS__;
    		$instance = new $class( $filename );
    	}
    	return $instance;
    }

    // Don't forget to block cloning
    function __clone() {
        trigger_error("Cannot clone a singleton", E_USER_WARNING);
    }
}

Edit: __CLASS__ her fonksiyon mirası desteklemek için, tanımlanmış olan sınıfın sınıf adı olacağı için, her çocuğun sınıfta getInstance yöntemi yeniden tanımlamak gerekir.

class Conf2 extends Conf {
    function newMethod() { echo "Do something"; }

    function getInstance( $filename ) {
    	static $instance = null;
    	if ( $instance == null ) {
    		$instance = new self($filename);
    	}
    	return $instance;
    }
}

Eğer yukarıdaki yöntemi kullanmak eğer bir sürükle var, evet, ama, sadece kopyalama ve yapıştırma yapabilirsiniz. Ben bu late static binding ile PHP 5.3 sabit olduğuna inanıyorum, ama ben onaylamak için henüz yüklü değil.

Sizin kod gereksiz yere karmaşık. Eğer başka biri varsa hiç __ construct yöntemi gerekmez. (Ya da bunun tersi, ancak, php eski sürümleri __ yapıyı desteklemez)

Ayrıca, düzgün bir singleton deseni uygulamak, statik örnek sınıf kapsamı olmalı ve yapıcı özel olmalıdır.

class Singleton {
    private static $instance;

    private function Singleton(){
        //do stuff
    }

    function getInstance(){
        if(self::$instance == null){
            self::$instance = new Singleton();
        }

        return self::$instance;
    }
}

This article PHP4'te Singleton Pattern uygulamak için nasıl açıklar ve problemleri var.