Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将对象指定为值和引用在PHP中无法正常工作_Php_Oop - Fatal编程技术网

将对象指定为值和引用在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;

我有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;
$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