توی پی اچ پی بجز اشیا بقیه ی مقادیر پریمیتیو هستند و رفرنس تایپ نیستن. ینی شما مثلا وقتی یه آرایه رو به یک آرایه دیگه 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)
توی یه سری زبون ها نیازه که جایی که کال میکنیم هم علامت رو بذاریم ولی توی پی اچ پی فقط توی ورودی تابع بنویسیم کافیه.
امیدوارم به دردتون بخوره.
خیلی کاربردی بود!