将对象指定为值和引用在PHP中无法正常工作
我有Java背景。我在Java中使用对象作为值调用和引用。 但是当我在PHP中使用这些东西时,我没有达到预期的效果将对象指定为值和引用在PHP中无法正常工作,php,oop,Php,Oop,我有Java背景。我在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;
<?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;
?>
当我按值将一个对象指定给另一个对象时,如果我修改“复制对象”中属性的值,这也会影响原始对象
请澄清我的疑问任何人
感谢…哼哼…PHP的价值和参考支持。然而,有一些怪癖
默认情况下,PHP5始终通过引用指定/传递对象:
$obj1 = new stdClass();
$obj2 = $obj1;
print spl_object_hash($obj1);
print "<br>";
print spl_object_hash($obj2);
基本上,$obj1和$obj2都是指向同一对象的指针
但是,对于基元类型(如整型、字符串等),情况并非如此
使用
&
也可以通过引用原语传递
$var1 = "some string";
$var2 = &$var1;
$var1 = "foo";
print $var1;
print '<br>';
print $var2;
您也可以通过值传递对象
$obj1 = new stdClass();
$obj2 = clone $obj1;
print spl_object_hash($obj1);
print "<br>";
print spl_object_hash($obj2);
简而言之,默认情况下,基本类型是按值传递的,而对象是按引用传递的。据我所知,现代PHP只支持对对象的引用。您必须进行
克隆
,才能获得对新对象的引用。在您的第一个示例中,Java的行为不是完全相同吗?
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