gpt4 book ai didi

php - 取消设置对象 PHP 的所有实例

转载 作者:搜寻专家 更新时间:2023-10-31 20:41:16 24 4
gpt4 key购买 nike

我有一个类,它有一个返回自身新实例的方法。这允许我使用一个单一的对象,而不必一遍又一遍地声明具有相同值的新对象。对于那些想知道为什么不扩展类或其他东西的人来说,这只会让我的生活更轻松,而且它就像一个魅力,但我的最终目的是将它们全部删除。

例如:

$foo = new myClass('name1','ab','cd');
$bar = $foo->duplicate();

//duplicate() saves the new object in itself in an array:
array_push($this->instance,new myClass('name1','ab','cd'));
//and returns a pointer to the saved instance.
return end($this->instance);

$foo$bar 现在共享相同的方法和值,但这些值可以单独修改。

$foo->changeName('newName'); 

$bar->changeName('newName2');

我的问题是,如果我取消设置创建的第一个类 unset($foo) PHP 会自动取消设置其他实例 ($bar) 还是垃圾收集器最终删除它们?

我已经通过 unsettling $foo 测试了它,当我调用 $foo 时给我一个错误,但当我调用 $bar 时却没有。

我想做的是一次取消设置该类的所有实例。

谢谢。

最佳答案

自动清理?

不,PHP 不了解您的架构。它不会“级联”地移除对象,它们是独立的实体——例如,更多的,可以属于不同的范围。简单代码:

class Test
{
protected $id = null;
protected $uniqid = null;

public function __construct($id)
{
$this->id = $id;//user-passed variable
$this->uniqid = uniqid();//internal: to identify instance
}

public function getCopy()
{
return new self($this->id);
}

public function getIdentity()
{
return $this->uniqid;
}
}

$foo = new Test(3);
$bar = $foo->getCopy();
var_dump($foo->getIdentity());//valid

unset($foo);
//still valid: bar has nothing to do with foo
var_dump($bar->getIdentity());

顺便说一句,复制你可以使用clone在 PHP 中(然而,这显然会导致对象克隆)

简单的方法

解决问题的最简单方法是遍历 $GLOBALS,用 instanceof 检查它.这有一个严重的弱点:内部函数/方法范围不会受到影响:

//static since doesn't belong to any instance:
public static function cleanup()
{
foreach($GLOBALS as $name=>$var)
{
if($var instanceof self)
{
unset($GLOBALS[$name]);
}
}
}

-和

$foo = new Test(3);
$bar = $foo->getCopy();
var_dump($foo->getIdentity(), $bar->getIdentity());//valid
Test::cleanup();
//2 x notice:
var_dump($foo, $bar);

请注意,这与“子”机制无关(即它将清除全局范围内的所有实例 - 无论从哪个实例复制)。

常见情况

上面的示例将不会执行常见情况下的操作。为什么?想象一下,您将拥有 holder 类:

class Holder
{
protected $obj = null;

public function __construct($obj)
{
$this->obj = $obj;
}

public function getData()
{
return $this->obj;
}
}

然后您将实例传递给它:

$foo = new Test(3);
$bar = $foo->getCopy();
$baz = new Holder($bar);

- 那么在常见情况下,您将没有机会处理这种简单的情况。在更复杂的情况下,您也会被卡住。

怎么办?

我建议:显式销毁对象,当您需要这样做时。隐式取消设置是一种副作用,即使你会以某种方式维护它(我可以想象观察者模式 + 一些全局注册表) - 这将是可怕的副作用,这会破坏你的代码的可读性。同样是关于代码,它使用了我在上面写的 $GLOBALS - 我不建议在任何情况下都这样做。

关于php - 取消设置对象 PHP 的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21038448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com