PHP单身汉表演滑稽

PHP单身汉表演滑稽,php,class,object,singleton,Php,Class,Object,Singleton,我有以下代码: $e1 = call_user_func(array("MySQL_Extension", "getInstance")); $e2 = call_user_func(array("Error_Extension", "getInstance")); self::$extensions->MySQL = $e1; self::$extensions->Error = $e2; // Debug echo "<pre>"; print_r(self::$e

我有以下代码:

$e1 = call_user_func(array("MySQL_Extension", "getInstance"));
$e2 = call_user_func(array("Error_Extension", "getInstance"));
self::$extensions->MySQL = $e1;
self::$extensions->Error = $e2;

// Debug
echo "<pre>";
print_r(self::$extensions);
两个类都扩展了相同的“Extension\u Abstract”类,但出于某种原因,列出的“print\r”调试语句输出以下内容:

public static function getInstance()
{
    if (static::$_instance == null)
    {
        static::$_instance = new static();
    }

    return static::$_instance;
}

你们都知道为什么它会返回两个“MySQL\u Extension”对象,而完全忽略Error\u Extension类吗?我太糊涂了

既然
self
正在解析为
MySQL\u Extension
,我假设每个类都有这个方法(而不是在
Extension\u Abstract
中定义)。但是,
self:::$\u instance
在哪里定义?我的直觉是它是在
Extension\u Abstract
上定义的。只需在每个类中重新定义它(
受保护的静态$\u instance=null;

另外,如果您使用的是5.3+版本,则应该使用
静态
,而不是
self
,因为它允许您继承并使用后期静态绑定来确定类


如果没有帮助,发布更多代码(类定义会有帮助).

基类中是否有
$\u实例


如果是这样,那么整个层次结构就有了一个单例,而不是每个特定的子类。

试着不要使用
self:
,而是
MySQL\u扩展:
Error\u扩展:

此外,抽象父类
扩展\u abstract
不应包含
getInstance
方法的实现。

请参阅

问题是只有一个静态变量是在父类的范围内定义的。要创建两个静态变量,最简单的方法是在两个子类中定义$\u实例变量和get\u实例方法

另一种可能的解决方法在上述文章的评论中列出:“向静态方法调用传递一个额外的类名参数,告诉该方法它应该“充当”哪个类。”

后期绑定问题


getInstance
方法是在
MySQL\u扩展类中还是同时在这两个类中?是的!我一发布就发现了这一点:P谢谢你的帮助。我正试图使这个5.2.x变得友好,所以很多更好的单例模式都是不可能的。
stdClass Object (
    [MySQL] => MySQL_Extension Object
    [Error] => MySQL_Extension Object
)
public static function getInstance()
{
    if (static::$_instance == null)
    {
        static::$_instance = new static();
    }

    return static::$_instance;
}