-1

次のPHPコードがあります。

class SQLStatements {
    public function __construct($iName) {
        $this->name = $iName;
        $this->sqlStatement = array ();
    }

    public function addStatement($iSQLStatement) {
        $this->sqlStatement [] = $iSQLStatement;
    }

...other functions...
}

print_r ($ss);
$sqlStatements->addStatement ( $ss );   
print_r ($sqlStatements);

出力は次のとおりです。

SQLStatement オブジェクト
(
    [ID] => 300
    [タイムスタンプ] => 201301090222
    [フィクスチャ] => ホーム v アウェイ
    [結果] => ホーム
    [fixtureDateTime] => 2013-01-11
    [bookmakerOdds] => 配列
        (
            [0] => 2.15
            [1] => 2.22
            [2] => 2.05
            [3] => 2.05
            [4] => 2.15
            [5] => 2.20
            [6] => 2.14
        )

)
SQLStatements オブジェクト
(
    [名前] => TheStatement
    [sqlStatement] => 配列
        (
            [0] => SQLStatement オブジェクト
                (
                    [ID] => 300
                    [タイムスタンプ] => 201301090222
                    [フィクスチャ] => ホーム v アウェイ
                    [結果] => ホーム
                    [fixtureDateTime] => 2013-01-11
                    [bookmakerOdds] => 配列
                        (
                            [0] => 2.15
                            [1] => 2.22
                            [2] => 2.05
                            [3] => 2.05
                            [4] => 2.15
                            [5] => 2.20
                            [6] => 2.14
                        )

                )

        )

)
SQLStatement オブジェクト
(
    [ID] => 300
    [タイムスタンプ] => 201301090222
    [フィクスチャ] => ホーム v アウェイ
    [結果] => ホーム v アウェイ - 引き分け
    [fixtureDateTime] => 2013-01-11
    [bookmakerOdds] => 配列
        (
            [0] => 3.50
            [1] => 3.50
            [2] => 3.40
            [3] => 3.40
            [4] => 3.30
            [5] => 3.50
            [6] => 3.28
        )

)
SQLStatements オブジェクト
(
    [名前] => TheStatement
    [sqlStatement] => 配列
        (
            [0] => SQLStatement オブジェクト
                (
                    [ID] => 300
                    [タイムスタンプ] => 201301090222
                    [フィクスチャ] => ホーム v アウェイ
                    [結果] => ホーム v アウェイ - 引き分け
                    [fixtureDateTime] => 2013-01-11
                    [bookmakerOdds] => 配列
                        (
                            [0] => 3.50
                            [1] => 3.50
                            [2] => 3.40
                            [3] => 3.40
                            [4] => 3.30
                            [5] => 3.50
                            [6] => 3.28
                        )

                )

            [1] => SQLStatement オブジェクト
                (
                    [ID] => 300
                    [タイムスタンプ] => 201301090222
                    [フィクスチャ] => ホーム v アウェイ
                    [結果] => ホーム v アウェイ - 引き分け
                    [fixtureDateTime] => 2013-01-11
                    [bookmakerOdds] => 配列
                        (
                            [0] => 3.50
                            [1] => 3.50
                            [2] => 3.40
                            [3] => 3.40
                            [4] => 3.30
                            [5] => 3.50
                            [6] => 3.28
                        )

                )

        )

)

$ssSQLStatementオブジェクトであり、SQLStatementsオブジェクトはオブジェクトのコレクションですSQLStatement。ただし、出力からわかるように、SQLStatements->SQLStatement[0] と SQLStatements->SQLStatement[1] は同じです。私は SQLStatements->SQLStatement[0]->outcome が「Home v Away - Draw」ではなく「Home」になることを期待しています。私は何を間違っていますか?

4

1 に答える 1

1

オブジェクトが PHP のメソッドに渡されると、PHP は実際にはそのオブジェクトのアドレスの値をメモリに渡します。つまり、を呼び出すときaddStatement($ss)に、オブジェクトのコピーを$ssステートメント配列に追加するのではなく、メモリ内のそのオブジェクトへのポインターを追加します。後で$ssオブジェクトを変更すると、SQLStatements クラスの配列でも変更されます (メモリ内の同じオブジェクトを指しているため)。

あなたがしなければならないことは、 を呼び出した後addStatement($ss)、次のようなことを行う必要があります:$ss = new SQLStatement()そして変更を加えて再度追加することができます ( を作成するnew SQLStatement()ことにより、この新しいオブジェクトに別のメモリ ブロックが割り当てられ、その場所には新しいメモリがあります)。に割り当てられた古いオブジェクトと競合しないアドレス$ss。)

于 2013-01-08T17:11:38.350 に答える