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

голоса
174

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

Задан 03/08/2008 в 23:51
источник пользователем
На других языках...                            


13 ответов

голоса
215

Это по стоимости в соответствии с 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.'
?>
Ответил 04/08/2008 d 00:06
источник пользователем

голоса
52

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

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

Ответил 11/08/2008 d 03:09
источник пользователем

голоса
37

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

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

Ответил 14/03/2012 d 07:09
источник пользователем

голоса
24

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

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

Ответил 04/08/2008 d 00:57
источник пользователем

голоса
19

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

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

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

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

выведет

var1: тест, var2: заключительный тест, var3: последний тест

Передается по значению / эталонной exampe:

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

changeThem($var1, $var2);

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

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

выход будет:

var1: Foo, var2 BAR

Объект переменные передаются по ссылке exampe:

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

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

Ответил 03/08/2008 d 23:52
источник пользователем

голоса
7

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

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

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
Ответил 21/12/2014 d 09:27
источник пользователем

голоса
5

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

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

так

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
Ответил 22/02/2009 d 10:17
источник пользователем

голоса
4

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

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

Ответил 04/08/2008 d 01:05
источник пользователем

голоса
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: б, а SwapValues: а, б

Ответил 11/05/2010 d 16:51
источник пользователем

голоса
1

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

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

Ответил 09/01/2010 d 17:34
источник пользователем

голоса
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
Ответил 31/03/2018 d 12:34
источник пользователем

голоса
0

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

Ответил 15/07/2015 d 11:25
источник пользователем

голоса
-6

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

Ответил 03/08/2008 d 23:52
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more