php - 将对象分配为值和引用在 PHP 中无法正常工作

标签 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;
$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);

输出:

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

简而言之,默认情况下基本类型按值传递,而对象按引用传递。

关于php - 将对象分配为值和引用在 PHP 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19872397/

相关文章:

oop - 如何设计对象?

Python:如何 "kill"类实例/对象?

php - 转换时间格式为 HH :MM AM/PM to HH:MM:SS

php PDO MySQL 根据另一个表的结果数组选择一个表的结果

PHP – setcookie() 不工作

javascript - 在 es6 中扩展单例类

c++ - 一个类(class)的规模限制是多少?

java - 需要澄清继承和异常

php - 选择两列中一列为空的行

php - 将实时 MP3 音频流捕获到文件