PHP变量是通过值还是通过引用传递的?

PHP变量是通过值还是通过引用传递的?


它是根据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.'
?>

似乎有很多人被对象传递给函数的方式以及通过引用方式传递的方式弄糊涂了。 对象变量仍然按值传递,它只是在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

以通过参考传递。


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

我希望你能理解这一点。

链接地址: http://www.djcxy.com/p/3489.html

上一篇: Are PHP Variables passed by value or by reference?

下一篇: Does Javascript pass by reference?