215

私はこのコードを持っています:

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
);

次のエラーが表示されます。

解析エラー: 19 行目の /home/user/Sites/site/registration/inc/registration.class.inc に構文エラー、予期しない '('、')' が必要です

だから、私は何か間違ったことをしていると思います...しかし、そうでない場合、どうすればこれを行うことができますか? 通常の文字列で mktime を変更すると、機能します。だから、私はそのようにそれを行うことができることを知っています..

誰にもいくつかの指針がありますか?

4

9 に答える 9

353

PHPは、イニシャライザーで重要な式を解析できません。

クラスの定義の直後にコードを追加することで、これを回避することを好みます。

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

また

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

PHP 5.6は、いくつかの式を処理できるようになりました。

/* For Abstract classes */
abstract class Foo{
    private static function bar(){
        static $bar = null;
        if ($bar == null)
            bar = array(...);
        return $bar;
    }
    /* use where necessary */
    self::bar();
}
于 2009-03-28T23:50:04.017 に答える
33

クラスのロードを制御できる場合は、そこから静的な初期化を行うことができます。

例:

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

クラスローダーで、次のようにします。

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

より重いソリューションは、ReflectionClass とのインターフェースを使用することです。

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

クラスローダーで、次のようにします。

$rc = new ReflectionClass($klass);
if(in_array('StaticInit', $rc->getInterfaceNames())) { $klass::staticInit() }
于 2010-12-17T11:24:07.307 に答える
23

静的変数を機能させる方法を見つける代わりに、私は単にゲッター関数を作成することを好みます。特定のクラスに属する配列が必要な場合にも役立ち、実装がはるかに簡単になります。

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

リストが必要な場合は、getterメソッドを呼び出すだけです。例えば:

if (array_key_exists($type, MyClass::getTypeList()) {
     // do something important...
}
于 2011-10-16T15:20:19.903 に答える
10

これは複雑すぎて定義に設定できません。ただし、定義をnullに設定してから、コンストラクターで確認し、変更されていない場合は設定できます。

private static $dates = null;
public function __construct()
{
    if (is_null(self::$dates)) {  // OR if (!is_array(self::$date))
         self::$dates = array( /* .... */);
    }
}
于 2009-03-28T23:13:10.563 に答える
4

コードのこの部分で関数呼び出しを行うことはできません。他のコードが実行される前に実行される init() タイプのメソッドを作成すると、変数を設定できます。

于 2009-03-28T22:53:04.980 に答える
4

最善の方法は、次のようなアクセサーを作成することです。

/**
* @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;
}

次に、 static::db(); を実行できます。またはself::db(); どこからでも。

于 2013-09-03T14:52:50.570 に答える
-1

コード例で、うまくいけば役立つポインターを次に示します。初期化関数が一度だけ呼び出されることに注意してください。

また、呼び出しを逆にするStaticClass::initializeStStateArr()$st = new StaticClass()、同じ結果が得られます。

$ 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);

どの利回り:

$ php static.php
Starting...
In initializeStStateArr
Array
(
    [CA] => California
    [CO] => Colorado
)
于 2013-07-11T18:23:54.193 に答える