I have the following PHP code:
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);
Output is:
SQLStatement Object
(
[id] => 300
[timestamp] => 201301090222
[fixture] => Home v Away
[outcome] => Home
[fixtureDateTime] => 2013-01-11
[bookmakerOdds] => Array
(
[0] => 2.15
[1] => 2.22
[2] => 2.05
[3] => 2.05
[4] => 2.15
[5] => 2.20
[6] => 2.14
)
)
SQLStatements Object
(
[name] => TheStatement
[sqlStatement] => Array
(
[0] => SQLStatement Object
(
[id] => 300
[timestamp] => 201301090222
[fixture] => Home v Away
[outcome] => Home
[fixtureDateTime] => 2013-01-11
[bookmakerOdds] => Array
(
[0] => 2.15
[1] => 2.22
[2] => 2.05
[3] => 2.05
[4] => 2.15
[5] => 2.20
[6] => 2.14
)
)
)
)
SQLStatement Object
(
[id] => 300
[timestamp] => 201301090222
[fixture] => Home v Away
[outcome] => Home v Away - Draw
[fixtureDateTime] => 2013-01-11
[bookmakerOdds] => Array
(
[0] => 3.50
[1] => 3.50
[2] => 3.40
[3] => 3.40
[4] => 3.30
[5] => 3.50
[6] => 3.28
)
)
SQLStatements Object
(
[name] => TheStatement
[sqlStatement] => Array
(
[0] => SQLStatement Object
(
[id] => 300
[timestamp] => 201301090222
[fixture] => Home v Away
[outcome] => Home v Away - Draw
[fixtureDateTime] => 2013-01-11
[bookmakerOdds] => Array
(
[0] => 3.50
[1] => 3.50
[2] => 3.40
[3] => 3.40
[4] => 3.30
[5] => 3.50
[6] => 3.28
)
)
[1] => SQLStatement Object
(
[id] => 300
[timestamp] => 201301090222
[fixture] => Home v Away
[outcome] => Home v Away - Draw
[fixtureDateTime] => 2013-01-11
[bookmakerOdds] => Array
(
[0] => 3.50
[1] => 3.50
[2] => 3.40
[3] => 3.40
[4] => 3.30
[5] => 3.50
[6] => 3.28
)
)
)
)
$ss is a SQLStatement Object and the SQLStatements object is a collection of SQLStatement Objects. However as you can see from the output, SQLStatements->SQLStatement[0] and SQLStatements->SQLStatement[1] are the same. I am expecting SQLStatements->SQLStatement[0]->outcome to be ‘Home’, not ‘Home v Away – Draw’. What am I doing wrong?
When an object is passed to a method in PHP, PHP actually passes the value of that object’s address in memory. What that means is, when you call
addStatement($ss), you’re not adding a copy of the$ssobject to the statements array – you’re adding a pointer to that object in memory. If you later change the$ssobject, it will also be changed on your array in the SQLStatements class (because they point to the same object in memory).What you should be doing is, after calling
addStatement($ss), you should do something like:$ss = new SQLStatement()and then you can make your changes and add it again (by creating anew SQLStatement()you have allocated another block of memory for this new object, and that location has a new memory address which won’t conflict with the old object that was assigned to$ss.)