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

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

+184
источник поделиться
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
источник

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

В 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
источник

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

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

+24
источник

Переменные 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
источник

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

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

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
+7
источник

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

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

так

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
+5
источник

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

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

+4
источник

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

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

+1
источник
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
источник

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

0
источник

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

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
источник

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

-6
источник

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