PHP: Nasıl statik değişkenlerini başlatmak için

8 Cevap php

Bu kodu vardır:

private static $dates = array(
  'start' => mktime( 0,  0,  0,  7, 30, 2009),  // Start date
  'end'   => mktime( 0,  0,  0,  8,  2, 2009),  // End date
  'close' => mktime(23, 59, 59,  7, 20, 2009),  // Date when registration closes
  'early' => mktime( 0,  0,  0,  3, 19, 2009),  // Date when early bird discount ends
);

Hangi bana aşağıdaki hatayı veriyor:

19 hattı üzerinde sözdizimi hatası, beklenmedik in '(' bekliyor ') / home / user / Siteler / site / kayıt / inc / registration.class.inc: hatası Ayrıştırma

Yani, ben yanlış bir şey yapıyorum sanırım ... ama eğer ben bu böyle değil nasıl yapabilirim? Ben düzenli dizeleri ile mktime şeyler değiştirmek, çalışır. Bu yüzden ben sort of bunu böyle biliyorum ..

Herkes bazı noktalar var mı?

8 Cevap

PHP initializers olmayan önemsiz ifadeleri ayrıştırmak olamaz.

Ben sağ sınıfının tanımından sonra kod ekleyerek bu geçici bir çözüm için tercih:

class Foo {
  static $bar;
}
Foo::$bar = array(…);

veya

class Foo {
  private static $bar;
  static function init()
  {
    self::$bar = array(…);
  }
}
Foo::init();

PHP 5.6 şimdi bazı ifadeleri ele, ama hala hiçbir diziler olabilir.

Bunun yerine statik değişkenler çalışma almak için bir yol bulma, ben sadece bir alıcı işlevi oluşturmak için tercih. Ayrıca yardımcı belirli bir sınıfa ait diziler gerekir ve uygulamak için çok basit eğer.

class MyClass
{
   public static function getTypeList()
   {
       return array(
           "type_a"=>"Type A",
           "type_b"=>"Type B",
           //... etc.
       );
   }
}

Listeyi gereken yere, sadece alıcı yöntemini çağırın. Örneğin:

if (array_key_exists($type, MyClass::getTypeList()) {
     // do something important...
}

Eğer sınıf yüklemenin üzerinde kontrol varsa, orada statik başlatılıyor yapabilirsiniz.

Örnek:

class MyClass { public static function static_init() { } }

sınıf yükleyici, aşağıdakileri yapın:

include($path . $klass . PHP_EXT);
if(method_exists($klass, 'static_init')) { $klass::staticInit() }

Daha ağır bir çözüm ReflectionClass ile bir arayüz kullanmak olacaktır:

interface StaticInit { public static function staticInit() { } }
class MyClass implements StaticInit { public static function staticInit() { } }

sınıf yükleyici, aşağıdakileri yapın:

$rc = new ReflectionClass($klass);
if(in_array('StaticInit', $rc->getInterfaceNames())) { $klass::staticInit() }

Yani tanımında ayarlamak için çok karmaşık. Gerçi null tanım kümesi, ve sonra oluşturucu içinde, kontrol ve değişiklik olmamıştır eğer olabilir - ayarlayın:

private static $dates = null;
public function __construct()
{
    if (is_null(self::$dates)) {  // OR if (!is_array(self::$date))
         self::$dates = array( /* .... */);
    }
}

Sen bu kod bölümünde fonksiyon çağrıları yapamazsınız. Bir init başka kod sonra sonra değişken doldurmak mümkün olacak gelmez önce idam olur () tipi yöntemi yaparsanız.

İşte umarım yararlı işaretçi bir kod örneğinde, olduğunu. Başlatıcı işlevi yalnızca bir kez çağrılır nasıl unutmayın.

Eğer StaticClass::initializeStStateArr() ve çağrıları ters Ayrıca, $st = new StaticClass() Eğer aynı sonucu alırsınız.

$ cat static.php
<?php

class StaticClass {

  public static  $stStateArr = NULL;

  public function __construct() {
    if (!isset(self::$stStateArr)) {
      self::initializeStStateArr();
    }
  }

  public static function initializeStStateArr() {
    if (!isset(self::$stStateArr)) {
      self::$stStateArr = array('CA' => 'California', 'CO' => 'Colorado',);
      echo "In " . __FUNCTION__. "\n";
    }
  }

}

print "Starting...\n";
StaticClass::initializeStStateArr();
$st = new StaticClass();

print_r (StaticClass::$stStateArr);

Hangi verimleri:

$ php static.php
Starting...
In initializeStStateArr
Array
(
    [CA] => California
    [CO] => Colorado
)

en iyi yolu, bu gibi erişenine oluşturmak için:

/**
* @var object $db : map to database connection.
*/
public static $db= null; 

/**
* db Function for initializing variable.   
* @return object
*/
public static function db(){
 if( !isset(static::$db) ){
  static::$db= new \Helpers\MySQL( array(
    "hostname"=> "localhost",
    "username"=> "root",
    "password"=> "password",
    "database"=> "db_name"
    )
  );
 }
 return static::$db;
}

o) (statik :: db yapabilirsiniz; veya self :: db (); yerden.

Ben Tjeerd Visser adlı ve porneL cevabı bir arada kullanın.

class Something
{
    private static $foo;

    private static getFoo()
    {
        if ($foo === null)
            $foo = [[ complicated initializer ]]
        return $foo;
    }

    public static bar()
    {
        [[ do something with self::getFoo() ]]
    }
}

Ama daha iyi bir çözüm statik yöntemlerle uzakta yapmak ve Singleton deseni kullanmaktır. Sonra sadece yapıcı karmaşık başlatma yapın. Yoksa yaptığınız bir "hizmet" ve ihtiyacı olan her sınıfa içine enjekte DI kullanın.