当前位置: 首页 > 面试题库 >

获取PHP中类的所有实例

姜天宇
2023-03-14
问题内容

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

例如:

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中添加了循环参考垃圾收集,可能会提供其他垃圾收集机会)



 类似资料:
  • 问题内容: 在Java中,是否有任何可能的方法来获取某个类的所有实例? 问题答案: 实例化类(Singleton模式)时,可以使用Factory静态初始化程序,然后将工厂构造函数中的每个生成的实例添加到List中。 像这样的东西:

  • 我有一个名为Attributes的类,它有如下所列的一些实例变量:

  • 问题内容: 可以说我有一个Java程序包,其中包含所有继承自的类,我能以某种方式获得所有这些类吗?我正在锁定以下方面的东西: 这样有可能吗? 问题答案: 这是一个基本示例,假定类未打包JAR:

  • 问题内容: 给定一个PHP字符串数组,例如: 如何生成此数组元素的所有可能排列?即: 问题答案: function pc_permute($items, $perms = array()) { if (empty($items)) { echo join(‘ ‘, $perms) . “ “; } else { for ($i = count($items) - 1; $i >= 0; –$i)

  • 问题内容: 我有一个类,我想找到它的所有 公共字段 (不是方法)。我怎样才能做到这一点? 谢谢! 问题答案: 返回该类的所有公共变量的数组。 返回整个类继承中的字段。如果要仅在相关类中定义字段,而不在其超类中定义字段,请使用,并通过以下方法过滤它们: 的字面实际上代表类型的对象。检查其文档以获取更多有趣的反射方法。 上面的类是。您可以查看整个程序包。

  • 我试图得到trait(接口)的所有实例子类。这个特性有多个实现,由第三方用户提供。 这是否可能得到所有实例子类没有显式绑定,因为我没有控制,实现由第三方用户提供。? 我已经看到了同样的问题,你需要明确地绑定。 代码示例: 这不起作用。任何帮助都将不胜感激!