|
Posted by petersprc on 10/10/06 02:45
Hi,
In PHP4, objects were handled using copy-on-write semantics. In PHP5,
this is no longer the case. In this code, you would probably want to
make a copy of the cell objects using the clone operator, instead of
referencing them. For instance:
public function setInitialState() {
// Clear the target array
$this->initialState = array();
// Iterate over the source objects
foreach ($this->getCurrentState() as $cell) {
// Use the clone operator to copy the object:
$this->initialState[] = clone $cell;
}
}
Some more info on cloning in PHP5:
http://us2.php.net/manual/en/language.oop5.cloning.php
The clone operator will by default create a shallow copy of an object.
(You can change this behavior by implementing a __clone method in
Cell.)
FYI, here's an interesting look into PHP variable management:
http://www.quepublishing.com/articles/article.asp?p=516587&seqNum=2&rl=1
Adam wrote:
> I am creating a program to create sudoku games. I have an object that
> is 1 row of a sudoku game. I store the initial state of the row before
> I start figuring out the values to place in each cell, in case the
> program runs into a problem and has to revert the row back to its
> original state.
>
> So first I store the initial State of the row, then I start to modify
> the row. My problem is that once I start to change the original row,
> it also changes the initial state that I saved. The only thing I can
> think that is doing this is that instead of creating a copy of the
> object's data in my initial state variable, it is just changing its
> pointer to the original rows location.
>
> I wrote a smaller test case to show what I am talking about. At the
> end of the program, each cell in the initial state should be full of
> numbers 1 to 9. Instead, it is a copy of the current state of the row.
>
>
> Hopefully someone can clue me in on what I am missing? You can see the
> output of the program here
> http://mustang.millersville.edu/~arisser/sudoku/test.php
>
> Thanks again for the help!!
>
> <?php
> ###########################################################
>
> class Cell {
> public $c = array(1,2,3,4,5,6,7,8,9);
>
> //_____________________________________________________
>
> public function getCandidates() {
> return $this->c;
> }
>
> //_____________________________________________________
>
> public function pickRandomCandidate() {
> return $this->c[rand() % count($this->c)];
> }
>
> //_____________________________________________________
>
> public function setCandidate($a) {
> $this->c = array($a);
> }
>
> //_____________________________________________________
>
> public function removeCandidateFromCell($v) {
> $this->c = array_values(array_diff($this->c,array($v)));
> }
> }
>
> ###########################################################
>
> class Row {
> public $cells = array();
> public $initialState = array();
>
> //_____________________________________________________
>
> public function __construct() {
> for ($i=0;$i<9;$i++)
> $this->cells[$i] = new Cell();
> }
>
> //_____________________________________________________
>
> public function getInitialState() {
> return $this->initialState;
> }
>
> public function getCurrentState() {
> return $this->cells;
> }
>
> //_____________________________________________________
>
> public function setInitialState() {
> $this->initialState = $this->getCurrentState();
> }
>
> //_____________________________________________________
>
> public function printRow() {
> echo "<strong>Printing Row State</strong>";
> echo "<table border=1 cellpadding=4>";
> echo "<tr>";
> foreach($this->cells as $cell) {
> echo "<td align='center'>";
> for($i=1; $i <= 9; $i++) {
> echo (in_array($i, $cell->c)) ? $i : "<span style='color:
> #ddd'>$i</span>";
> echo $i==3 || $i==6 ? "<br />" : "";
> }
> echo "</td>";
> }
> echo "</tr>";
>
> echo"</table>";
> }
>
> //_____________________________________________________
>
> public function printInitialState($rowNum = "") {
> echo "<strong>Initial State of $rowNum</strong>";
> echo "<table border=1 cellpadding=4>";
> echo "<tr>";
> foreach($this->initialState as $cell) {
> echo "<td align='center'>";
> for($i=1; $i <= 9; $i++) {
> echo (in_array($i, $cell->c)) ? $i : "<span style='color:
> #ddd'>$i</span>";
> echo $i==3 || $i==6 ? "<br />" : "";
> }
> echo "</td>";
> }
> echo "</tr>";
> echo"</table>";
> }
> //_____________________________________________________
>
> public function resetRow($rowNum = "") {
> echo "resetting row $rowNum <br />";
> $this->cells = $this->getInitialState();
> #$this->cells = $this->initialState;
> }
>
> //_____________________________________________________
>
> public function removeCandidateFromRow($v) {
> foreach($this->cells as $c => $val) {
> $val->removeCandidateFromCell($v);
> }
> }
> }
>
> $myrow = new Row();
>
> $myrow->setInitialState();
>
> $candidate = $myrow->cells[0]->pickRandomCandidate();
>
> $myrow ->removeCandidateFromRow($candidate);
> $myrow->cells[0]->setCandidate($candidate);
>
> $myrow->printRow();
> $myrow->printInitialState();
> ?>
Navigation:
[Reply to this message]
|