2011-01-18 3 views
1

У меня есть следующий код:PHP 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::$extensions); 

Каждый метод деЫпзЬапсе() выглядит следующим образом:

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

    return self::$_instance; 
} 

обоих классов распространяется тот же класс «Extension_Abstract», но по какой-то причине , в выписании выписок «print_r» перечислены следующие значения:

stdClass Object (
    [MySQL] => MySQL_Extension Object 
    [Error] => MySQL_Extension Object 
) 

У вас есть идеи, почему я t будет возвращать два объекта «MySQL_Extension» и полностью игнорировать класс Error_Extension? Я весьма озадачен!

+0

Является ли метод getInstance в классе 'MySQL_Extension' или в обоих? – lonesomeday

ответ

1

Поскольку self является разрешающие MySQL_Extension, я предполагаю, что каждый класс имеет этот метод (а не определяется в Extension_Abstract. Однако, где self::$_instance определяется? Мой инстинкт, что он определен на Extension_Abstract. Просто заново определить его в каждом классе (protected static $_instance = null;).

Кроме того, вместо self, если вы используете 5.3+ вы должны использовать static, поскольку она позволяет наследовать и использовать поздний статическое связывание для определения класса.

Если это не поможет, напишите больше кода (определения классов помогут) ...

0

$_instance в базовом классе?

Если да, то у вас есть синглтон для всей иерархии, а не для каждого конкретного подкласса.

0

Не используйте self::, но MySQL_Extension:: и Error_Extension:: явно.

Кроме того, абстрактный родительский класс Extension_Abstract не должен содержать реализацию для метода getInstance.

2

См. http://socket7.net/article/php-5-static-and-inheritance.

Проблема в том, что существует только одна статическая переменная, определенная в рамках родительского класса. Чтобы создать две статические переменные, самый простой способ - просто определить переменную $ _instance и метод get_instance в обоих подклассах.

Другого возможный обходной путь указан в комментариях к предыдущей статье: «передать дополнительный параметр имени класса в статический метод звонков, сообщающий метод, какой класс он должен« действовать как».

+0

Yup! Выяснил это, как только я разместил его: P Спасибо за помощь. Я пытаюсь сделать это 5.2.x дружелюбным, так что многие из лучших моделей одноэлементного стиля - это не-go. – Andrew

0

позднего связывания вопрос.

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

    return static::$_instance; 
} 
Смежные вопросы