如何解决是通过值还是引用来完成多个变量分配?
|$a = $b = 0;
在上面的代码中,$a
和$b
都被赋了0
的值,还是$a
只是引用$b
?
解决方法
对于原始类型,这是一个副本。
test.php
$a = $b = 0;
$b = 3;
var_dump($a);
var_dump($b);
输出:
int(0)
int(3)
尽管有了对象,这是另一个故事(PHP 5)
test.php
class Obj
{
public $_name;
}
$a = $b = new Obj();
$b->_name = \'steve\';
var_dump($a);
var_dump($b);
输出量
object(Obj)#1 (1) { [\"_name\"]=> string(5) \"steve\" }
object(Obj)#1 (1) { [\"_name\"]=> string(5) \"steve\" }
, 将此代码视为:
$a = ($b = 0);
表达式$b = 0
不仅将0
分配给$b
,而且还产生结果。该结果是赋值的正确部分,或者只是赋值$b
的值。
因此,$a
也被分配了0
。
, 你本来可以尝试的
$a = $b = 0;
$a = 5;
echo $b;
要么
$a = $b = 0;
$b = 5;
echo $a;
(目前我不在乎:D)
因此:不,它们都是值0
的独立变量。
, 我会建议您阅读以下内容:http://terriswallow.com/weblog/2007/multiple-and-dynamic-variable-assignment-in-php/。在评论之一中,您可以阅读:
应该注意的是,如果您使用
一行上的多个分配
分配一个对象,该对象是
通过引用分配。因此,如果
您更改对象的值
使用任一变量的属性,
价值在本质上都改变了。
因此,我个人建议您分别分配变量。
作为记录:
$a = $b = 4;
var_dump($a,$b);
$b = 5;
var_dump($a,$b);
产量:
int(4)
int(4)
int(4)
int(5)
但:
class Tmp
{
public $foo;
public function __construct()
{
$this->foo = \'bar\';
}
}
$a = $b = new Tmp();
var_dump($a,$b);
$a->foo = \'oth\';
var_dump($a,$b);
产量:
object(Tmp)#1 (1) {
[\"foo\"]=>
string(3) \"bar\"
}
object(Tmp)#1 (1) {
[\"foo\"]=>
string(3) \"bar\"
}
object(Tmp)#1 (1) {
[\"foo\"]=>
string(3) \"oth\"
}
object(Tmp)#1 (1) {
[\"foo\"]=>
string(3) \"oth\"
}
因此,结论是没有对基元的引用,但有对对象的引用。
, $ a和$ b都被分配了0值。如果您希望$ a引用$ b,则可以用&字符代替它,例如:
$a = & $b = 0;
http://php.net/manual/en/language.oop5.basic.php
, 这取决于您要分配的内容。
如果您要分配一个值,则分配会将原始变量复制到新变量。
范例1:
$a = $b = 0;
$b++; echo $a;
上面的代码将按值分配返回“ 3”。
范例2:
$a = ($b = 4) + 5; // $a is equal to 9 now,and $b has been set to 4.
对象中发生了通常的按值分配行为的例外情况,对象是对象,这些对象在PHP 5中是通过引用自动分配的。可以通过clone关键字显式复制对象。
例子3
$a = $b = $c = new DOMdocument();
$c->appendChild($c->createElement(\'html\'));
echo $a->saveHTML();
上面的代码将打印<html></html>
。
, 它给他们都赋值为0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。