获取PHP中类的所有实例

我想获取某个类的对象的所有实例。

例如:

class Foo {

}

$a = new Foo();

$b = new Foo();

$instances = get_instances_of_class('Foo');

$instances应该是array($a, $b)array($b, $a)(顺序无关紧要)。

一个加号是,如果该函数将返回具有所请求类的超类的实例,尽管这不是必需的。

我能想到的一种方法是使用包含实例数组的静态类成员变量。在类的构造函数和析构函数中,我将$this在数组中添加或删除。如果我必须在许多类上这样做,这将很麻烦且容易出错。

回答:

如果您从TrackableObject类派生所有对象,则可以将此类设置为处理此类事情(只需确保调用parent::__construct()parent::__destruct()在子类中重载这些对象时即可)。

class TrackableObject

{

protected static $_instances = array();

public function __construct()

{

self::$_instances[] = $this;

}

public function __destruct()

{

unset(self::$_instances[array_search($this, self::$_instances, true)]);

}

/**

* @param $includeSubclasses Optionally include subclasses in returned set

* @returns array array of objects

*/

public static function getInstances($includeSubclasses = false)

{

$return = array();

foreach(self::$_instances as $instance) {

if ($instance instanceof get_class($this)) {

if ($includeSubclasses || (get_class($instance) === get_class($this)) {

$return[] = $instance;

}

}

}

return $return;

}

}

与此相关的主要问题是,垃圾回收不会自动拾取任何对象(因为仍然存在对它的引用TrackableObject::$_instances),因此__destruct()需要手动调用它来销毁所述对象。(在PHP

5.3中添加了循环参考垃圾收集,可能会提供其他垃圾收集机会)

以上是 获取PHP中类的所有实例 的全部内容, 来源链接: utcz.com/qa/409074.html

回到顶部