pass - php variable length argument




PHP變量是通過值還是通過引用傳遞的? (9)

PHP變量是通過值還是通過引用傳遞的?


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

(最後一個例子可能會更好......)


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

在PHP 5中有一個新的對像模型。 PHP的對象處理已經完全重寫,可以獲得更好的性能和更多的功能。 在以前的PHP版本中,對像被處理為基本類型(例如整數和字符串)。 這種方法的缺點是,在分配變量或作為參數傳遞給方法時,會在語義上複製整個對象。 在新方法中,對象由句柄引用,而不是由值引用(可以將句柄看作對象的標識符)。


你可以這樣做。

在前面放一個'&'符號,你傳遞的變量變成一個,並且和它的原點一樣。 即:你可以通過引用傳遞,而不是複制它。

所以

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

包含原始類型的變量在PHP5中按值傳遞。 包含對象的變量通過引用傳遞。 Linux Journal從2006年開始提供了一篇非常有趣的文章,其中提到了4和5之間的這種差異和其他OO差異。

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


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

我希望你能理解這一點。


如果您希望簡單地更改原始變量並將其重新返回到指定了新值的相同變量名稱,請將其用於函數。

function add(&$var){ // The & 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

實際上這兩種方法都是有效的,但它取決於您的要求。通過引用來傳遞值通常會使您的腳本變慢。 因此,考慮到執行時間,最好通過值來傳遞變量。 當您按值傳遞變量時,代碼流更加一致。



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





pass-by-value