【问题标题】:Why it's happen in php? what is the meaning of the output?为什么它发生在php中?输出的含义是什么?
【发布时间】:2019-02-06 11:12:41
【问题描述】:
class foo {
    public $x;
    function __construct() {
        $this->x = 5;
    }
}


$foo1 = $foo2 = new foo;
$f1 = $f2 = 5;

echo "foo1 = ".$foo1->x;
echo PHP_EOL;
echo "foo2 = ".$foo2->x;
$foo2->x = 50;

echo PHP_EOL;
echo "foo1 = ".$foo1->x;
echo PHP_EOL;
echo "foo2 = ".$foo2->x;

为什么会发生在 php 中?输出的含义是什么? 我上次问过没有代码。

【问题讨论】:

  • 哦我记得这个问题,the screenshot居然给了它;我记得太清楚了。该帖子要么被删除,要么在另一个帐户下。
  • @FunkFortyNiner 我希望你一切顺利。感谢 Jedward 今天是星期五!!! (为什么工作落后让我不断回到 SO :-(
  • @Martin Aye,我是伙计。也希望你们一切都好。 TGIF!
  • 我希望我能找到一个程序员滚下山的GIF;总是让我发笑(键盘是“轮子”的中心)
  • 因为:$foo1 = $foo2 = new foo;

标签: php class assign


【解决方案1】:

这是因为您将 $foo1 和 $foo2 分配给同一个对象。因此 $foo1->x 与 $foo2->x

是同一个变量

您真正想要的是创建类 foo 的两个不同实例。

例如:

$foo1 = new foo();
$foo2 = new foo();

如果您需要进一步解释,可以查看 php 文档中的 the page about objects and references

【讨论】:

    【解决方案2】:

    与数组不同,PHP 中的对象在分配时不会被复制。所以$foo1$foo2 都指向同一个foo 对象。对该对象所做的任何更改都将通过任一变量可见。

    您可以使用new foo 两次使用单独的对象来初始化它们:

    $foo1 = new foo;
    $foo2 = new foo;
    

    或者你可以使用clone复制对象:

    $foo1 = clone $foo2 = new foo;
    

    【讨论】:

      【解决方案3】:
      $foo1 = $foo2 = new foo;
      

      两个变量都持有同一个对象,因此设置 $foo2->x = 50 也将其设置为 $foo1,因为它只是同一事物的另一个名称。

      【讨论】:

      • 这与引用无关。这是因为对象在分配时不会被复制,就像数组一样。
      猜你喜欢
      • 1970-01-01
      • 2019-07-13
      • 2013-05-10
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多