Свойства класса PHP перезаписываются при сохранении в массив

Это, вероятно, очень простое объяснение, но у меня этот код работал месяцами, а теперь внезапно сегодня он не работает.

Я извлекаю все строки из таблицы. У меня есть и объект, который является моделью сущности таблицы, из которой я выбираю. Когда я читаю строки из массива ассоциативных результатов, я сохраняю каждое свойство, используя "$this->propertyName", а затем помещаю каждый объект в массив. До того, как я получил массив объектов, теперь я повторял массив того же объекта. Вот фрагмент кода:

     $mdSelectALL_sql="SELECT * FROM member_data";

     $mdSelectALL=mysql_query($mdSelectALL_sql,$mdConn);

     if(!$mdSelectALL){
            die('Error: ' . mysql_error());
     }
     else{
            echo "RETURNING ALL MEMBER DATA RECORDS!!!<br>";

            //store all records into array
            while($row=mysql_fetch_array($mdSelectALL))
            {


                    $this->mdId=$row['md_id'];
                    $this->mdFname=$row['md_fname'];
                    $this->mdLname=$row['md_lname'];
                    $this->mdEmail=$row['md_email'];
                    $this->mdTwitter=$row['md_twitter'];
                    $this->mdFacebook=$row['md_facebook'];
                    $this->mdMyspace=$row['md_myspace'];
                    $this->mdPhoneNumber=$row['md_phonenumber'];
                    $this->mdNotes=$row['md_notes'];



                    //store records in array
                    array_push($mdArray,$this);

           }//end while

           // print_r($mdArray); prints the array and each element is the last record  encountered in the SQL retrieval

            return $mdArray;

            }//end else

Мои геттеры и сеттеры выглядят так для каждого свойства:

       function get_mdId(){
              return $this->mdId;
       }

       function set_mdId($id){
             $this->mdId=$id;
       }

И предложения или идеи?

-tu

1 ответ

Решение

Объекты передаются по ссылке. Это означает, что когда вы изменяете значение, это значение будет меняться везде, где вы использовали этот объект.

Поскольку вы храните один и тот же объект каждый раз - $this - вы получите массив ссылок на один и тот же объект.

Чтобы решить это, вы можете сделать:

$mdArray = array();
while($row=mysql_fetch_array($mdSelectALL))
{
   $tmp_object = new MyObject;   // fill in the name of your object...

   $tmp_object->mdId=$row['md_id'];
   ...

   array_push($mdArray, $tmp_object);
}
Другие вопросы по тегам