我想获取某个类的对象的所有实例。
例如:
class Foo {
}
$a = new Foo();
$b = new Foo();
$instances = get_instances_of_class('Foo');
$instances
应该是array($a, $b)
or array($b, $a)
(顺序无关紧要)。
一个优点是该函数将返回具有所请求类的超类的实例,尽管这不是必需的。
我能想到的一种方法是使用保存实例数组的静态类成员变量。在类的构造函数和析构函数中,我会添加或删除$this
从数组中。如果我必须在很多类上这样做,这是相当麻烦且容易出错的。
如果您从 TrackableObject 类派生所有对象,则可以设置该类来处理此类事情(只需确保您调用parent::__construct()
and 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
), so __destruct()
需要手动调用来销毁该对象。 (循环引用垃圾收集是在 PHP 5.3 中添加的,可能会提供额外的垃圾收集机会)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)