Сведения о вопросе

DUNKER

16:03, 1st July, 2020

Теги

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

Просмотров: 1296   Ответов: 13

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



  Сведения об ответе

прога

18:03, 1st July, 2020

Это по стоимости согласно документации 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.'
?>


  Сведения об ответе

VERSUION

18:03, 1st July, 2020

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

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


  Сведения об ответе

PHPH

18:03, 1st July, 2020

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

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


  Сведения об ответе

qwerty101

18:03, 1st July, 2020

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

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


  Сведения об ответе

FAriza

18:03, 1st July, 2020

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

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

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

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

был бы выход

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

Пройденный по значению / эталонному экзамену:

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

changeThem($var1, $var2);

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

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

был бы выход:

вар1: фу, переменная2 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

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


  Сведения об ответе

Chhiki

18:03, 1st July, 2020

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

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

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>


  Сведения об ответе

nYU

18:03, 1st July, 2020

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

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

так

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.


  Сведения об ответе

DAAA

18:03, 1st July, 2020

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

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


  Сведения об ответе

park

18:03, 1st July, 2020

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: а, б


  Сведения об ответе

lool

18:03, 1st July, 2020

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

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


  Сведения об ответе

pumpa

18:03, 1st July, 2020

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


  Сведения об ответе

qwerty101

18:03, 1st July, 2020

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

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


  Сведения об ответе

PIRLO

18:03, 1st July, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться