O (C # gibi) PHP statik sınıflar oluşturmak mümkün mü?

5 Cevap php

Ben bu yüzden, PHP statik bir sınıf oluşturmak istiyorsanız ve C # yaptığı gibi davranmak zorunda

  1. Oluşturucu otomatik sınıfına ilk çağrı denir
  2. Hiçbir örnekleme gerekli

Bu tür bir şey ...

static class Hello {
    private static $greeting = 'Hello';

    private __construct() {
        $greeting .= ' There!';
    }

    public static greet(){
        echo $greeting;
    }
}

Hello::greet(); // Hello There!

5 Cevap

PHP statik sınıfları olabilir ama (siz deneyin ve kendini :: __construct () arayın eğer bir hata alırsınız) otomatik kurucu demiyorlar.

Bu nedenle, bir initialize() işlevi oluşturmak ve her bir yöntemde aramak gerekiyor:

<?php

class Hello
{
    private static $greeting = 'Hello';
    private static $initialized = false;

    private static function initialize()
    {
    	if (self::$initialized)
    		return;

        self::$greeting .= ' There!';
    	self::$initialized = true;
    }

    public static function greet()
    {
    	self::initialize();
        echo self::$greeting;
    }
}

Hello::greet(); // Hello There!


?>

Greg'in cevap ek olarak ben bu sınıf örneğini imkansız olduğunu, yapıcı özel ayarlamanızı tavsiye ederim.

Yani benim düşünceme göre bu Greg'in bir dayalı bir daha tam bir örneğidir:

<?php

class Hello
{
    /**
     * Construct won't be called inside this class and is uncallable from
     * the outside. This prevents instantiating this class.
     * This is by purpose, because we want a static class.
     */
    private function__construct() {}
    private static $greeting = 'Hello';
    private static $initialized = false;

    private static function initialize()
    {
        if (self::$initialized)
            return;

        self::$greeting .= ' There!';
        self::$initialized = true;
    }

    public static function greet()
    {
        self::initialize();
        echo self::$greeting;
    }
}

Hello::greet(); // Hello There!


?>

Eğer bu "statik" gibi sınıflar olabilir. ama gerçekten önemli bir şey eksik olduğunu varsayalım: php Eğer bir uygulama döngüsü yok, böylece tüm uygulama gerçek bir statik (veya singleton) almazsınız ...

bkz http://stackoverflow.com/questions/432192/singleton-in-php

final Class B{

    static $staticVar;
    static function getA(){
        self::$staticVar = New A;
    }
}

b izomeriyi ayrıca bunu bir singeton işleyicisi calld edilir

Class a{
    static $instance;
    static function getA(...){
        if(!isset(self::$staticVar)){
            self::$staticVar = New A(...);
        }
        return self::$staticVar;
    }
}

this is the singleton use $a = a::getA(...);

Ben genelde normal olmayan statik sınıflar yazmak ve nesnenin tek (sudo statik) örneklerini örneğini bir fabrika sınıfını kullanmayı tercih.

Normal başına bu şekilde yapıcı ve yıkıcı çalışmaları ve ben (örneğin ikinci DB bağlantı) isterseniz ben olmayan ek statik örneği oluşturabilirsiniz

Bunu her zaman kullanmak ve sayfa yıkıcı veritabanına oturum itecektir sonlandırıldığında gibi, özel DB mağaza oturum işleyicileri oluşturmak için özellikle yararlıdır.

Diğer bir avantajı her şeyi talep üzerine kurulum olacak gibi şeyler aramak sırasını görmezden olabilir.

class Factory {
    static function &getDB ($construct_params = null)
    {
        static $instance;
        if( ! is_object($instance) )
        {
            include_once("clsDB.php");
            $instance = new clsDB($construct_params);   // constructor will be called
        }
        return $instance;
    }
}

DB sınıf ...

class clsDB {

    $regular_public_variables = "whatever";

    function __construct($construct_params) {...}
    function __destruct() {...}

    function getvar() { return $this->regular_public_variables; }
}

Her yerde sadece aramak kullanmak istiyorum ...

$static_instance = &Factory::getDB($somekickoff);

Sonra sadece (çünkü onlar) olmayan statik olarak tüm yöntemleri tedavi

echo $static_instance->getvar();