Передаются ли переменные PHP по значению или по ссылке?


Передаются ли переменные PHP по значению или по ссылке?

Author: hichris123, 2008-08-04

13 answers

Это по значению в соответствии с Документацией 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.'
?>
 235
Author: Michael Stum, 2016-07-05 10:56:14

Похоже, многих людей смущает то, как объекты передаются функциям и что означает передача по ссылке. Объектные переменные по-прежнему передаются по значению, просто значение, передаваемое в 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

Для того, чтобы пройти по ссылке.

 55
Author: grom, 2014-10-28 16:10:25

В 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.

Я надеюсь, что вы сможете это понять.

 43
Author: hardik, 2012-03-14 06:09:47

Http://www.php.net/manual/en/migration5.oop.php

В PHP 5 появилась новая объектная модель. Обработка объектов PHP была полностью переписана, что позволило повысить производительность и расширить возможности. В предыдущих версиях PHP объекты обрабатывались как примитивные типы (например, целые числа и строки). Недостатком этого метода было то, что семантически весь объект копировался при назначении переменной или передавался в качестве параметра методу. В новый подход, на объекты ссылаются по дескриптору, а не по значению (можно рассматривать дескриптор как идентификатор объекта).

 24
Author: Karl Seguin, 2008-08-03 23:57:46

Переменные PHP присваиваются по значению, передаются функциям по значению, а при содержании/представлении объектов передаются по ссылке. Вы можете принудительно передавать переменные по ссылке, используя &

Присваивается значением/ссылочным примером:

$var1 = "test";
$var2 = $var1;
$var2 = "new test";
$var3 = &$var2;
$var3 = "final test";

print ("var1: $var1, var2: $var2, var3: $var3);

Выведет

Var1: тест, 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 БАР

Объект переменные, переданные эталонным примером:

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";
}

Выведет:

ФУ

(этот последний пример, вероятно, мог бы быть лучше...)

 19
Author: cmcculloh, 2017-06-28 13:18:06

Вы можете передать переменную в функцию по ссылке. Эта функция сможет изменять исходную переменную.

Вы можете определить проход по ссылке в определении функции:

<?php
function changeValue(&$var)
{
    $var++;
}

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
 7
Author: Mahsin, 2014-12-21 10:21:07

Вы можете сделать это в любом случае.

Поставьте символ "&" впереди, и переменная, которую вы передаете, станет такой же, как и ее происхождение. т.е.: вы можете передавать по ссылке, а не делать ее копию.

Итак

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
 5
Author: Bingy, 2009-02-22 09:17:14

Переменные, содержащие примитивные типы, передаются по значению в PHP5. Переменные, содержащие объекты, передаются по ссылке. В журнале Linux Journal за 2006 год есть довольно интересная статья, в которой упоминается это и другие различия между 4 и 5.

Http://www.linuxjournal.com/article/9170

 4
Author: Polsonby, 2008-08-04 00:05:05

Объекты передаются по ссылке в PHP 5 и по значению в PHP 4. Переменные передаются по значению по умолчанию!

Читайте здесь: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html

 1
Author: Miha, 2010-01-09 16:34:13
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>";

Атрибуты все еще могут быть изменены, если они не передаются по ссылке, поэтому будьте осторожны.

Вывод:

Объекты обмена: b, значения обмена: a, b

 1
Author: Ricardo Saracino, 2010-05-11 15:51:24

На самом деле оба метода действительны, но это зависит от ваших требований.Передача значений по ссылке часто замедляет работу вашего скрипта. Поэтому лучше передавать переменные по значению, учитывая время выполнения. Кроме того, поток кода более согласован, когда вы передаете переменные по значению.

 0
Author: atif, 2015-07-15 11:25:18

Используйте это для функций, когда вы хотите просто изменить исходную переменную и снова вернуть ей то же имя переменной с присвоенным ей новым значением.

function add(&$var){ // The &amp; is before the argument $var
   $var++;
}
$a = 1;
$b = 10;
add($a);
echo "a is $a,";
add($b);
echo " a is $a, and b is $b"; // Note: $a and $b are NOT referenced
 0
Author: PPL, 2018-03-31 12:34:37

Зависит от версии, 4 - по значению, 5 - по ссылке.

 -6
Author: Karl Seguin, 2008-08-03 22:52:11