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

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

Ответ 1

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

Ответ 2

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

чтобы пройти по ссылке.

Ответ 3

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

Надеюсь, вы поймете это.

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 8

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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