0

私は、アクティブ レコード パターンに従う PHP 5.3.x のクラスの小さなセットに取り組んできました。ただし、静的プロパティを操作するときに問題が発生します。これをテストしてきたコードは次のとおりです。

<?php

class dbPreparedObject {

    public static $insert = "";

    public function __construct() {
        static::$insert = "autoinsert_".get_called_class();
    }
}

class gtRecord extends dbPreparedObject {}
class nRecord extends dbPreparedObject {}

$a = new gtRecord();
$b = new nRecord();

var_dump(gtRecord::$insert);
var_dump(nRecord::$insert);

出力:

string(18) "autoinsert_nRecord"
string(18) "autoinsert_nRecord"

ただし、最初の文字列がautoinsert_gtRecord.

子クラスによってインスタンス化されていない静的プロパティが関連付けられているようです。public static $insert = ""すべての子クラスで宣言せずにそれらを分離する方法はありますか?

4

1 に答える 1

1

これは予期される動作です。PHP では、静的に宣言されたプロパティは、作成されたオブジェクトのすべてのインスタンス間で共有されます。つまり、 のインスタンスまたはその継承クラス$insertのすべてのインスタンスに対して、 のインスタンスは 1 つだけです。dbPreparedObject

autoinsert_nRecord両方のが表示var_dumpされているのは、それが最後に作成したオブジェクトだからです。

この小さな変更を検討してください。

$a = new gtRecord();
var_dump(gtRecord::$insert); // autoinsert_gtRecord

$b = new nRecord();    
var_dump(nRecord::$insert);  // autoinsert_nRecord
var_dump(gtRecord::$insert); // autoinsert_nRecord (because it was the last one set)

最初の var_dump の後、値は_gtRecordになりますが、オブジェクトが作成されると、それが最後のクラスだったので、nRecord(すべての dbPreparedObject オブジェクトの) 静的プロパティが に変更されます。nRecord

したがって、このクラスの複数のインスタンスを持つことを計画している場合、$insert静的にすることはできません。これ$insertは、すべてのオブジェクトで同じ静的プロパティのコピーが 1 つしかないため、指定されたコードに期待する値が常に含まれるとは限らないためです。1 つのオブジェクトで変更すると、すべてのオブジェクトで変更されます。

そのため、なぜ$insert静的にする必要があるのか​​、この問題に遭遇しないようにするために他にどのようなオプションがあるのか​​を尋ねる必要があります。

于 2012-07-09T15:52:38.733 に答える