Почему:
$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 в цикле может распечатать другое свойство объекта, но когда он попадает в массив, свойство объекта становится последним значением?
Это потому, что я толкаю один и тот же объект? Почему при переназначении работает при работе с переменной, но не с объектом?
Вы помещаете один и тот же объект в свой массив каждый раз:
// 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