PHP nasıl statik initializers olmaması için yapmak gerekir?

5 Cevap php

Ben ayrı bir dosya içine her sınıf koyarak ve sınıf tanımı dışında statik başlatma yapmayı düşünüyorum.

Bu sorun söz konusu sınıf aslında (sınıfını içeren dosyayı ilk kez dahil olduğunda o olacak) tabi önce başlatma olacağı gerçektir. Bu sınıf, dolayısıyla başlatma gereksiz, hiç kullanılmayacak ortaya çıkabilir, çünkü bir sorun. Ve ben senin kod başında kullanılan dosyalar değil de dahil olmak üzere uygulama sadece kirli bir tekniktir düşünüyorum.

Herkes bu soruna kalıcı bir çözüm varsa, ben çok takdir ediyorum.

5 Cevap

Bir sınıf denilen ve dosya bu sınıfını içeren dahil gerekiyordu bulunamadı zaman autoload __ için görünebilir. O işlevi statik ilklendiricileri koyabilirsiniz.

Gibi bu kodu bir göz atın. Bu veritabanı bir tek örneğini kullanır ama yine sınıfın örneklerini oluşturabilirsiniz:

class DB
{
    private static $_db;

    public static function pdo()
    {
        if (is_null(self::$_db))
        {
            self::$_db=new PDO('pgsql:host=localhost;
                                port=5432;
                                dbname=testdb;
                                user=postgres;
                                password=abc123');
            self::$_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }

        return self::$_db;
    }

public static function factory()
{
    return new self;
}

private function __construct() {}

Eğer DB örneğini, istediğiniz zaman yapmak DB::factory(). DB kullanımları self::pdo() veritabanına erişmek için singleton dönmek için.

Eğer oluşturulan sınıfının bir örneği önce statik yöntemleri kullanırsanız tekiz cevabı ... Burada bir sorun var ... Daha sonra statik başlatıcı çalıştırmak değil ... bu yüzden kimse her statik başlatıcı çalıştırabilirsiniz diyebilirsiniz yöntem ... bu doğrudur ama sadece ne almak ve statik değişkenleri ayarlama hakkında ... Ben bir de bunun için __ get ve __ set sihirli işlevleri kullanabilirsiniz ... statik desteklemiyor de dil ile ilgili bir sorun sadece orada olduğunu varsayalım intialization ... burada yapılabilir yoludur ...

dosya Hi.php in:

class Hi{
public static $v = "0";
}

Hi::$v= "2";
// end of Hi.php file

simple use a .php file per class... and do the static initialization outside of the class definition...

Yerine statik aramaların singleton deseni kullanın:

<?php
class Foo {

   protected static $_instance;

   /**
   * @return Foo
   */
   public static function getInstance() {
        return (null === self::$_instance)? 
            self::$_instance :
            self::$_instance = new Foo();
   }

   protected function __construct() {
        // initialize here
   }
}

Bu bunu yapmak yoludur. Sadece maliyet $ doneinit statik aydan Eğer inşa her zaman test edilir.

class Foo {
   private static $doneinit=false;

   private static init() {
      // do static initialisation here

      self::$doneinit=true;
   }

   public function __construct() {
      if (!self::$doneinit) self::init();

      // go on to do the rest of construction
   }
}

Basit, ve bu sınıf içinde her şeyi tutar.