https://stackoverflow.com/questions/746224/are-there-pointers-in-php
In PHP, arguments are passed by value by default. So when calling a function, when you pass in your values, they are copied by value not by reference.
There is something interesting to note though. Because pass-by-value mode could result in more memory usage, and PHP is an interpreted language (so programs written in PHP are not as fast as compiled programs), to make the code run faster and minimize memory usage, there are some tweaks in the PHP interpreter.
Which means, when you are coping a variable into another variable, PHP will copy a reference to the first variable into the second variable. So your new variable, is actually a reference to the first one until now. The value is not copied yet. But if you try to change any of these variables, PHP will make a copy of the value, and then changes the variable. This way you will have the opportunity to save memory and time, IF YOU DO NOT CHANGE THE VALUE.
return $object е по принцип безсмислено ако го предаваш като параметър, защото всъщност предаваш рефърънс, а не самият обект, и каквото и да правиш с този обект, остава за него глобално. Но тук е важно да се припомни, че важи едно нещо, наречено lazy copy. В какъв смисъл?
Нека разгледаме следните два примера:
$o = new stdClass; $o->ala = 123; var_dump($o); // object(stdClass)#1 (1) { // ["ala"]=> int(123) // } function patapan1(stdClass $obj): void { $obj->bala = 456; } patapan1($o); var_dump($o); // object(stdClass)#1 (2) { // ["ala"]=> int(123) // ["bala"]=> int(456) // } //--------------------------------------------------- $a = [111, 222]; var_dump($a); // array(2) { // [0]=> int(111) // [1]=> int(222) // } function patapan2(array $arr): void { $arr[] = 456; } patapan2($a); var_dump($a); // array(2) { // [0]=> int(111) // [1]=> int(222) // }
Когато предаваме обект като аргумент на функция, винаги се предава реферънсът към този обект. Каквито и промени да правим с този обект вътре във функцията (включително unset-ване на пропърти), те се оказват всъщност глобални, извън скоупа на функцията, защото са промени по рефърънс, не по стойност.
При масивите е доста по-различно, и всъщност lazy copy важи за тях, не за обектите. В смисъл, че като предадеш масив като аргумент на функция, пак предаваш реферънс, подобно на обектите, но внесеш ли каквато и да е промяна в този предаден масив, (unset-ване, добавяне на елемент…), тогава вече PHP създава копие на масива със скоуп, локален за функцията. Тогава вече тези промени не важат извън функцията и ако искаш да ги имаш, трябва да return-неш масива.