PHPvariables是通过值还是通过引用传递的?

PHPvariables是通过值还是通过引用传递的?

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

看来有很多人被对象传递给函数的方式和通过引用方式传递的方式弄糊涂了。 对象variables仍然通过值传递,它只是在PHP5中传递的值是一个引用句柄。 作为certificate:

 <?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 

通过引用传递意味着我们可以修改调用者看到的variables。 上面的代码显然没有这样做。 我们需要将交换function更改为:

 <?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

在PHP 5中有一个新的对象模型。 PHP的对象处理已经被完全重写,可以获得更好的性能和更多的function。 在以前的PHP版本中,对象被处理为基本types(例如整数和string)。 这种方法的缺点是,在分配variables或作为parameter passing给方法时,语义上复制整个对象。 在新方法中,对象由句柄引用,而不是由值引起(可以将句柄看作对象的标识符)。

PHPvariables是按值赋值,按值传递给函数的,当包含/表示对象是通过引用传递的。 你可以强制variables通过引用传递使用&

按值/参考示例分配:

 $var1 = "test"; $var2 = $var1; $var2 = "new test"; $var3 = &$var2; $var3 = "final test"; print ("var1: $var1, var2: $var2, var3: $var3); 

会输出

var1:test,var2:最终testing,var3:最终testing

通过价值/参考实例:

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

会输出:

var1:foo,var2 BAR

通过引用实例传递的对象variables:

 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

(最后一个例子可能会更好…)

你可以通过引用将一个variables传递给一个函数。 这个function将能够修改原来的variables。

您可以在函数定义中通过引用来定义段落:

 <?php function changeValue(&$var) { $var++; } $result=5; changeValue($result); echo $result; // $result is 6 here ?> 

你可以做到这一点。

在前面加一个'&'符号,你传递的variables变成一个和它的原点相同。 即:您可以通过引用传递,而不是复制它。

所以

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

包含原始types的variables在PHP5中按值传递。 包含对象的variables通过引用传递。 从2006年的“Linux Journal”中有一篇非常有趣的文章提到了4和5之间的这种差异。

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

对象在PHP 5中通过引用传递,在PHP 4中通过值传递。默认情况下,通过值传递variables!

在这里阅读: 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

其实这两种方法是有效的,但这取决于您的要求。通过引用的通过值经常使您的脚本慢。 所以考虑到执行时间,最好通过值来传递variables。 另外,当您按值传递variables时,代码stream更加一致。

取决于版本,4是价值,5是参考。