私はこのコードを持っています:
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を通常の文字列で変更すると、機能します。だから私はそれができることを知っているsort ofそのように..
誰かがポインターを持っていますか?
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();
}
クラスの読み込みを制御できる場合は、そこから静的な初期化を行うことができます。
例:
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() }
静的変数を機能させる方法を見つけるのではなく、単純にゲッター関数を作成することを好みます。また、特定のクラスに属する配列が必要な場合や、実装がずっと簡単な場合にも役立ちます。
class MyClass
{
public static function getTypeList()
{
return array(
"type_a"=>"Type A",
"type_b"=>"Type B",
//... etc.
);
}
}
リストが必要な場合は、ゲッターメソッドを呼び出すだけです。例えば:
if (array_key_exists($type, MyClass::getTypeList()) {
// do something important...
}
Tjeerd VisserとporneLの回答を組み合わせて使用します。
class Something
{
private static $foo;
private static getFoo()
{
if ($foo === null)
$foo = [[ complicated initializer ]]
return $foo;
}
public static bar()
{
[[ do something with self::getFoo() ]]
}
}
しかし、より良い解決策は、静的メソッドを廃止し、Singletonパターンを使用することです。次に、コンストラクタで複雑な初期化を行うだけです。または、それを「サービス」にし、DIを使用して、それを必要とするクラスに注入します。
定義で設定するには複雑すぎます。ただし、定義をnullに設定してから、コンストラクターでそれを確認し、変更されていない場合は設定してください。
private static $dates = null;
public function __construct()
{
if (is_null(self::$dates)) { // OR if (!is_array(self::$date))
self::$dates = array( /* .... */);
}
}
コードのこの部分で関数呼び出しを行うことはできません。他のコードが実行される前に実行されるinit()タイプのメソッドを作成すると、変数を設定できます。
最適な方法は、次のようなアクセサーを作成することです。
/**
* @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();どこからでも。
PHP 7.0.1では、これを定義できました。
public static $kIdsByActions = array(
MyClass1::kAction => 0,
MyClass2::kAction => 1
);
そして、次のように使用します:
MyClass::$kIdsByActions[$this->mAction];