在PHP中,有没有一种方法可以找出一个类已经被实例化了多少次?

6

我目前正在使用这种方法:

class Foo {
    private static $num_instances = 0;

    function __construct() {
        self::$num_instances++;
    }
}

这似乎可以正常工作,但我想知道是否有内置的方法...


5
在我看来,这似乎是唯一从我的脑海中走出去的方法。在谷歌和php.net上进行快速搜索后,除了这个解决方案之外,没有其他解决方案。顺便说一下,在__destruct()时你可能需要减少这个数字。 - mauris
我认为PHP没有记录此类信息的理由。我很好奇。你现在有实际需要吗? - webbiedave
"Need" 这个词有点过于强烈了,但我正在基于另一组对象创建一组对象,并且我希望它们维持它们的创建顺序,因此我将其作为“权重”字段使用。虽然有很多其他方法可以解决这个问题,但我想起了这个方法... - sprugman
4个回答

0

如果有的话,我会感到惊讶。
在我看来,如果它总是计算创建的实例数量,那么这将是一种开销。


0

0

您可以随时检查$GLOBALS并计算类实例化的数量。

这不是很好看,我更喜欢使用静态属性来完成它。


0

一种方法是通过计算 $GLOBALS 中的实例数量来处理它(如Alix所建议的):

function count_instances( $class_name ) {
    $i = 0;
    foreach ( $GLOBALS as $key => $global ) {
        if ( 'global' === $key ) continue;
        if ( 'object' === gettype($global) ) {
            if ( $class_name === get_class($global) ) $i++;
        }
    }
    return $i;
}

但请注意,这不包括未存储在变量中实例化的类。例如,它将把$var = new className();的实例添加到$GLOBALS,但不会仅仅添加调用而没有封装的new className();(只有调用本身)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接