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