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

StackOverflow https://stackoverflow.com/questions/879

Вопрос

Передаются ли переменные 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:тест, var2:заключительный тест, вариант 3:заключительный тест

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

$var1 = "foo";
$var2 = "bar";

changeThem($var1, $var2);

print "var1: $var1, var2: $var2";

function changeThem($var1, &$var2){
    $var1 = "FOO";
    $var2 = "BAR";
}

вывел бы:

var1:foo, БАР var2

Объектные переменные, передаваемые по ссылке example:

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

Вывел бы:

ФУ

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

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

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

<?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.Переменные, содержащие объекты, передаются по ссылке.Есть довольно интересная статья из Linux Journal за 2006 год, в которой упоминается это и другие различия OO между 4 и 5.

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

Объекты передаются по ссылке в 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>";

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

Выходной сигнал:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top