是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.php.net/manual/en/migration5.oop.php

在PHP5有一个新的对象模型。PHP处理的对象已经完全改写,从而获得更好的绩效和更多的功能。在以前版本的PHP,对象是处理等基本类型(例如整数和strings)。这种方法的缺点是,从语义上的整个目的是时复制的变量分配,或通过作为一个参数的方法。在新的方法,对象是所引用的处理,而不是由的价值(一可以想到一个处理为对象的识别符)。

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吧

对象传递的变量的参考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

(这最后一个示例可以更好可能...)

你可以通过一个变量的一个函数的参考。这种功能将能够修改原始变量。

你可以定义通道通过引的功能定义:

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

$result=5;
changeValue($result);

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

您可以做它的无论哪种方式。

把一个'&'符号在前面和可变你是通过成为同一个作为其来源。即:你可以通过参考,而不是它的一个副本。

所以

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

变量包含的基本类型是传递的价值在PHP5.变量包含的对象是通过参考。还有一个相当有趣的文章,从Linux的杂志2006年其中提到的这个和其他OO之间的差异4和5。

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

目的是通过参照在PHP5和价值PHP4.变量通过价值默认情况下!

在这里阅读: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html

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一个 SwapValues:a,b

实际上这两种方法是有效的,但这取决于你的需求。通值的参考经常让你的脚本很缓慢。使其更好地通过变量值,通过考虑到时间的执行。也代码流动更加一致的时候,你通过变量的价值。

使用这一功能的,当你想要简单地改变原来的变量和返回它再次以同样的变量名称与其新的价值的分配。

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

取决于该版本,4,5个是通过参考。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top