Переназначение свойства объекта в цикле

0

Почему:

$test_obj = new stdClass(); 
$array = [];
for ($i=0; $i < 5; $i++) { 
    $test_obj->num = $i;
    array_push($array, $test_obj);
}
var_dump($array);

генерирует:

array(5) {
  [0] =>
  class stdClass#1 (1) {
    public $num =>
    int(4)
  }
  [1] =>
  class stdClass#1 (1) {
    public $num =>
    int(4)
  }
  [2] =>
  class stdClass#1 (1) {
    public $num =>
    int(4)
  }
  [3] =>
  class stdClass#1 (1) {
    public $num =>
    int(4)
  }
  [4] =>
  class stdClass#1 (1) {
    public $num =>
    int(4)
  }
}

а также:

$array = [];
for ($i=0; $i < 5; $i++) { 
    $test_obj = new stdClass(); 
    $test_obj->num = $i;
    array_push($array, $test_obj);
}
var_dump($array);

генерирует:

array(5) {
  [0] =>
  class stdClass#1 (1) {
    public $num =>
    int(0)
  }
  [1] =>
  class stdClass#2 (1) {
    public $num =>
    int(1)
  }
  [2] =>
  class stdClass#3 (1) {
    public $num =>
    int(2)
  }
  [3] =>
  class stdClass#4 (1) {
    public $num =>
    int(3)
  }
  [4] =>
  class stdClass#5 (1) {
    public $num =>
    int(4)
  }
}

Но:

$test_obj = new stdClass(); 
$array = [];
for ($i=0; $i < 5; $i++) { 

    $test_obj->num = $i;
    array_push($array, $test_obj);
    var_dump($test_obj);
}

генерирует:

class stdClass#1 (1) {
  public $num =>
  int(0)
}
class stdClass#1 (1) {
  public $num =>
  int(1)
}
class stdClass#1 (1) {
  public $num =>
  int(2)
}
class stdClass#1 (1) {
  public $num =>
  int(3)
}
class stdClass#1 (1) {
  public $num =>
  int(4)
}

Может кто-нибудь объяснить мне, почему var_dump в цикле может распечатать другое свойство объекта, но когда он попадает в массив, свойство объекта становится последним значением?

Это потому, что я толкаю один и тот же объект? Почему при переназначении работает при работе с переменной, но не с объектом?

  • 0
    С переменными вы перезаписываете значение переменной, но с объектом вы не перезаписываете объект, просто устанавливая новое значение для свойства того же объекта.
Теги:
object

1 ответ

1
Лучший ответ

Вы помещаете один и тот же объект в свой массив каждый раз:

// instance of the object
$test_obj = new stdClass(); 
$array = [];
for ($i=0; $i < 5; $i++) { 
    $test_obj->num = $i;
    array_push($array, $test_obj);
}

То же самое, что и делать:

$test_obj = new stdClass(); 
$array = [$test_obj, $test_obj, $test_obj, $test_obj, $test_obj];

Поэтому, если вы измените какое-либо свойство объекта, оно будет делать это для всех ваших элементов массива, потому что они ссылаются на один и тот же объект:

$test_obj = new stdClass(); 
$test_obj->num = 0;
// all items in the array now are '0'
$array = [$test_obj, $test_obj, $test_obj, $test_obj, $test_obj];
$test_obj->num = 1;
// all items in the array now are '1'

Причина, по которой он работает для вашего второго примера, заключается в том, что вы создаете новый объект и добавляете его в массив.

Причина, по которой ваш третий пример делает то, что он делает, заключается в том, что в этот момент это значение объекта:

$test_obj = new stdClass(); 
$test_obj->num = 0;
var_dump($test_obj); // ->num == 0
$test_obj->num = 1;
var_dump($test_obj); // ->num == 1
$test_obj->num = 2;
var_dump($test_obj); // ->num == 2

$test_obj = new stdClass(); 
$array = [];
for ($i=0; $i < 5; $i++) { 
    $test_obj->num = $i;
    array_push($array, $test_obj);
    // $test_obj->num == 0 on first iteration
    // $test_obj->num == 1 on first iteration
    // $test_obj->num == 3 on first iteration
    // $test_obj->num == 4 on first iteration
}

// $test_obj->num == 4 after the loop finished which is the same as your first example
  • 0
    Спасибо за объяснение .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню