توی پی اچ پی بجز اشیا بقیه ی مقادیر پریمیتیو هستند و رفرنس تایپ نیستن. ینی شما مثلا وقتی یه آرایه رو به یک آرایه دیگه assign میکنید اون دو تا آرایه جاهای جدا از حافظه رو اشغال میکنن و طبیعی هست که تغییر یکی روی اونیکی اثری نذاره. یه مثال ساده:
<?php
$numbers = [1, 2, 3];
$anothers = $numbers;
$anothers[1] = 5;
var_dump($numbers);
// Output:
array(3) {
[۰]=>
int(1)
[۱]=>
int(2)
[۲]=>
int(3)
}
اشیا اینطور نیستن و میشه توی این مثال راحتتر منظورم رو برداشت کرد:
<?php
class Test {
public $name;
}
$t1 = new Test();
$t1->name = "Test 1";
$t2 = $t1;
$t2->name = "Test 2";
var_dump($t1->name);
// Output:
string(6) "Test 2"
برای اینکه اشیا رو ازشون کپی بگیریم خیلی راحت ازش clone میگیریم:
<?php
class Test {
public $name;
}
$t1 = new Test();
$t1->name = "Test 1";
$t2 = clone $t1;
$t2->name = "Test 2";
var_dump($t1->name);
// Output:
string(6) "Test 1"
پریمیتیو ها رو هم میشه مثل رفرنس اساین کرد به یه علامت &
قبل از متغیری که میخواد اساین بشه:
$a = 2;
$b = &$a;
$b++;
var_dump($a);
// Output:
int(3)
و نهایتا اگه بخوایم چیزی که primitive هست رو بصورت رفرنس ارسال کنیم یه علامت &
قبل از اسمش میذاریم. به این صورت:
$x = 3;
function change(&$x) {
$x++;
}
change($x);
var_dump($x);
// Output:
int(4)
توی یه سری زبون ها نیازه که جایی که کال میکنیم هم علامت رو بذاریم ولی توی پی اچ پی فقط توی ورودی تابع بنویسیم کافیه.
امیدوارم به دردتون بخوره.