我来自Java Background。我在Java中使用了对象作为值调用和引用。 但是当我在PHP中使用这些东西时,我没有达到我预期的结果。
<?php
class A {
public $t;
function __construct() {
$this->t = 100;
}
}
/*By value */
echo 'By Value<br/>';
$obj1 = new A();
echo $obj1->t;
$obj2 = $obj1;
$obj2->t = 200;
echo $obj2->t;
echo $obj1->t; //expects Result 100 but it prints 200
/*By Reference */
echo '<br/>By Reference<br/>';
$obj3 = new A();
echo $obj3->t;
$obj4 = &$obj3;
echo $obj4->t;
$obj4->t = 500;
echo $obj4->t;
echo $obj3->t;
?>
当我按值分配一个对象到另一个对象时,如果我修改了复制对象中的属性值,则这也会影响原始对象。
Plz清除我对任何人的怀疑......
...谢谢
答案 0 :(得分:3)
Humm ...... PHP支持By Value和By Reference。但是,有一些怪癖......
默认情况下,PHP5始终通过引用分配/传递对象:
$obj1 = new stdClass();
$obj2 = $obj1;
print spl_object_hash($obj1);
print "<br>";
print spl_object_hash($obj2);
输出:
000000001ef37c150000000046e30ead
000000001ef37c150000000046e30ead
基本上,$ obj1和$ obj2都指向同一个对象。
但是,对于原始类型(例如整数,字符串等)
,情况并非如此$var1 = "some string";
$var2 = $var1;
$var1 = "foo";
print $var1;
print '<br>';
print $var2;
输出:
foo
some string
使用&
,您也可以通过引用原语传递。
$var1 = "some string";
$var2 = &$var1;
$var1 = "foo";
print $var1;
print '<br>';
print $var2;
输出:
foo
foo
你也可以按值传递对象
$obj1 = new stdClass();
$obj2 = clone $obj1;
print spl_object_hash($obj1);
print "<br>";
print spl_object_hash($obj2);
输出:
0000000062516daa000000001745e928
0000000062516da9000000001745e928
简而言之,默认情况下,原始类型按值传递,而对象则通过引用传递。