Переменные PHP передаются по значению или по ссылке?
Это по стоимости в соответствии с документацией PHP .
По умолчанию аргументы функции передаются по значению (так что, если значение аргумента внутри функции изменяется, оно не изменяется вне функции). Чтобы позволить функции изменять свои аргументы, они должны передаваться по ссылке.
Чтобы аргумент функции всегда передавался по ссылке, добавьте амперсанд ( & ) к имени аргумента в определении функции.
<?php function add_some_extra(&$string) { $string .= 'and something extra.'; } $str = 'This is a string, '; add_some_extra($str); echo $str; // outputs 'This is a string, and something extra.' ?>
Кажется, что многие люди путаются тем, как объекты передаются в функции, а какие – по ссылке. Переменные объекта по-прежнему передаются по значению, его просто значение, которое передается в PHP5, является ссылочным дескриптором. Как доказательство:
<?php class Holder { private $value; public function __construct($value) { $this->value = $value; } public function getValue() { return $this->value; } } function swap($x, $y) { $tmp = $x; $x = $y; $y = $tmp; } $a = new Holder('a'); $b = new Holder('b'); swap($a, $b); echo $a->getValue() . ", " . $b->getValue() . "\n";
Выходы:
a, b
Чтобы перейти по ссылке, мы можем изменить переменные, которые видят вызывающий. Который явно не делает код выше. Нам нужно изменить функцию свопинга на:
<?php function swap(&$x, &$y) { $tmp = $x; $x = $y; $y = $tmp; } $a = new Holder('a'); $b = new Holder('b'); swap($a, $b); echo $a->getValue() . ", " . $b->getValue() . "\n";
Выходы:
b, a
чтобы пройти по ссылке.
В PHP по умолчанию объекты передаются как эталонная копия в новый объект.
См. Этот пример ………….
class X { var $abc = 10; } class Y { var $abc = 20; function changeValue($obj) { $obj->abc = 30; } } $x = new X(); $y = new Y(); echo $x->abc; //outputs 10 $y->changeValue($x); echo $x->abc; //outputs 30
Теперь посмотрим это …………..
class X { var $abc = 10; } class Y { var $abc = 20; function changeValue($obj) { $obj = new Y(); } } $x = new X(); $y = new Y(); echo $x->abc; //outputs 10 $y->changeValue($x); echo $x->abc; //outputs 10 not 20 same as java does.
Теперь посмотрим это …………..
class X { var $abc = 10; } class Y { var $abc = 20; function changeValue(&$obj) { $obj = new Y(); } } $x = new X(); $y = new Y(); echo $x->abc; //outputs 10 $y->changeValue($x); echo $x->abc; //outputs 20 not possible in java.
Надеюсь, вы поймете это.
http://www.php.net/manual/en/migration5.oop.php
В PHP 5 есть новая объектная модель. Обработка PHP объектов полностью переписана, что обеспечивает лучшую производительность и дополнительные функции. В предыдущих версиях PHP объекты обрабатывались как примитивные типы (например, целые числа и строки). Недостатком этого метода было то, что семантически весь объект был скопирован при назначении переменной или передан как параметр для метода. В новом подходе объекты ссылаются на дескриптор, а не по значению (можно рассматривать дескриптор как идентификатор объекта).
Переменные PHP присваиваются значением, передаются функции по значению, а при хранении / представлении объектов передаются по ссылке. Вы можете принудительно передавать переменные по ссылке с помощью &
Присвоено значением / ссылочным примером:
$var1 = "test"; $var2 = $var1; $var2 = "new test"; $var3 = &$var2; $var3 = "final test"; print ("var1: $var1, var2: $var2, var3: $var3);
выводит
var1: test, var2: окончательный тест, var3: окончательный тест
Передано по значению / ссылочному экзамену:
$var1 = "foo"; $var2 = "bar"; changeThem($var1, $var2); print "var1: $var1, var2: $var2"; function changeThem($var1, &$var2){ $var1 = "FOO"; $var2 = "BAR"; }
будет выводить:
var1: foo, var2 BAR
Переменные объекта, переданные по эталонному экзамену:
class Foo{ public $var1; function __construct(){ $this->var1 = "foo"; } public function printFoo(){ print $this->var1; } } $foo = new Foo(); changeFoo($foo); $foo->printFoo(); function changeFoo($foo){ $foo->var1 = "FOO"; }
Выпустил бы:
FOO
(последний пример может быть лучше, вероятно …)
Вы можете передать переменную функции по ссылке. Эта функция сможет изменить исходную переменную.
Вы можете определить проход по ссылке в определении функции:
<?php function changeValue(&$var) { $var++; } $result=5; changeValue($result); echo $result; // $result is 6 here ?>
Вы можете сделать это в любом случае.
поместите символ «&» впереди, а переменная, которую вы передаете, становится одной и той же, что и ее начало. т.е.: вы можете передавать по ссылке, а не копировать ее.
так
$fred = 5; $larry = & $fred; $larry = 8; echo $fred;//this will output 8, as larry and fred are now the same reference.
Переменные, содержащие примитивные типы, передаются по значению в PHP5. Переменные, содержащие объекты, передаются по ссылке. В 2006 году из Linux Journal есть довольно интересная статья, в которой упоминаются эти и другие различия OO между 4 и 5.
Объекты передаются по ссылке в PHP 5 и по значению в PHP 4. Переменные передаются по значению по умолчанию!
Читайте здесь: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html
class Holder { private $value; public function __construct( $value ) { $this->value = $value; } public function getValue() { return $this->value; } public function setValue( $value ) { return $this->value = $value; } } class Swap { public function SwapObjects( Holder $x, Holder $y ) { $tmp = $x; $x = $y; $y = $tmp; } public function SwapValues( Holder $x, Holder $y ) { $tmp = $x->getValue(); $x->setValue($y->getValue()); $y->setValue($tmp); } } $a1 = new Holder('a'); $b1 = new Holder('b'); $a2 = new Holder('a'); $b2 = new Holder('b'); Swap::SwapValues($a1, $b1); Swap::SwapObjects($a2, $b2); echo 'SwapValues: ' . $a2->getValue() . ", " . $b2->getValue() . "<br>"; echo 'SwapObjects: ' . $a1->getValue() . ", " . $b1->getValue() . "<br>";
Атрибуты по-прежнему могут быть изменены, если они не переданы по ссылке, поэтому будьте осторожны.
Вывод:
SwapObjects: b, SwapValues: a, b
Фактически оба метода действительны, но это зависит от вашего требования. Пассивные значения по ссылке часто замедляют ваш скрипт. Поэтому лучше передавать переменные по значению, рассматривая время выполнения. Также поток кода более согласован, когда вы передаете переменные по значению.
Зависит от версии, 4 – по значению, 5 – по ссылке.