编程语言
首页 > 编程语言> > php – 将此对象添加到此静态数组的奇怪行为

php – 将此对象添加到此静态数组的奇怪行为

作者:互联网

目前我用这段代码测试:

<?php
    class Alert {
        private $type;
        private $message;
        public static $_alerts = array();

        public function add($type, $message) {
            $this->type = $type;
            $this->message = $message;
            self::$_alerts[] = $this;
        }
    }

    $alert = new Alert();

    $alert->add("warning", "test 1");
    $alert->add("error", "test 2");

    echo "<pre>";
    print_r(Alert::$_alerts);
    echo "</pre>";

但我的结果并不像预期的那样:

Array
(
    [0] => Alert Object
        (
            [type:Alert:private] => error
            [message:Alert:private] => test 2
        )

    [1] => Alert Object
        (
            [type:Alert:private] => error
            [message:Alert:private] => test 2
        )

)

为什么添加的对象发生了变化?

测试区域:http://codepad.viper-7.com/6q2H2A

解决方法:

那是因为你的对象(即内部上下文中的$this)将是be copied by reference,而不是值.要按值复制,您需要执行以下操作:

    public function add($type, $message) 
    {
        $this->type = $type;
        $this->message = $message;
        self::$_alerts[] = clone $this;
    }

作为替代方案,您需要实例化(例如,像新自我这样的构造 – 但克隆似乎在这里更灵活)您的对象可能需要复制多次.

顺便说一句,有很简单的方法来实现正在发生的事情.使用var_dump()而不是print_r() – 然后你会看到对象实际上是相同的.您的代码示例(即尚未修复复制的地方):

array(2) {
  [0]=>
  object(Alert)#1 (2) {
    ["type":"Alert":private]=>
    string(5) "error"
    ["message":"Alert":private]=>
    string(6) "test 2"
  }
  [1]=>
  object(Alert)#1 (2) {
    ["type":"Alert":private]=>
    string(5) "error"
    ["message":"Alert":private]=>
    string(6) "test 2"
  }
}

– 你可以看到,那里的物体是一样的.

标签:php,oop,static-array
来源: https://codeday.me/bug/20190831/1772869.html