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

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

184
04 авг. '08 в 1:51
источник поделиться
13 ответов

Он по значению в соответствии с Документация по 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.'
?>
231
04 авг. '08 в 2:06
источник

Кажется, что многие люди путаются тем, как объекты передаются в функции и что передает по ссылке. Переменные объекта по-прежнему передаются по значению, его просто значение, которое передается в 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
11 авг. '08 в 5:09
источник

В 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
14 марта '12 в 9:09
источник

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

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

24
04 авг. '08 в 2:57
источник

Переменные 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

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

19
04 авг. '08 в 1:52
источник

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

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

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
7
21 дек. '14 в 12:27
источник

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

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

так

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
5
22 февр. '09 в 12:17
источник

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

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

4
04 авг. '08 в 3:05
источник

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

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

1
09 янв. '10 в 19:34
источник
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, a SwapValues: a, b

1
11 мая '10 в 18:51
источник

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

0
15 июля '15 в 14:25
источник

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

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
31 марта '18 в 15:34
источник

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

-6
04 авг. '08 в 1:52
источник

Посмотрите другие вопросы по меткам или Задайте вопрос