Перейти с классом собственности.Есть несколько преимуществ ...
class Foo {
protected static $instance = null;
public static function instance() {
if (is_null(self::$instance)) {
self::$instance = new Foo();
}
return self::$instance;
}
}
Во-первых, автоматизировать тесты проще.Вы можете создать фиктивный класс foo, чтобы «заменить» экземпляр, чтобы другие классы, зависящие от foo, получили копию макета вместо оригинала:
class MockFoo extends Foo {
public static function initialize() {
self::$instance = new MockFoo();
}
public static function deinitialize() {
self::$instance = null;
}
}
Затем в ваших тестовых примерах (еслиphpunit):
protected function setUp() {
MockFoo::initialize();
}
protected function tearDown() {
MockFoo::deinitialize();
}
Это обходит общий недостаток синглетонов, который их сложно проверить.
Во-вторых, он делает ваш код более гибким.Если вы когда-нибудь захотите «заменить» функциональность во время выполнения в этом классе, все, что вам нужно сделать, - это создать подкласс и заменить self::$instance
.
В-третьих, он позволяет вам работать с экземпляром в другом статическом состоянии.функция.Это не очень важно для классов с одним экземпляром (настоящий синглтон), поскольку вы можете просто позвонить self::instance()
.Но если у вас есть несколько «именованных» копий (скажем, для соединений с базой данных или других ресурсов, где вы хотите более одной, но не хотите создавать новую, если они уже существуют), она становится грязной, потому что вам нужно отслеживатьиз имен:
protected static $instances = array();
public static function instance($name) {
if (!isset(self::$instances[$name])) {
self::$instances[$name] = new Foo($name);
}
return self::$instances[$name];
}
public static function operateOnInstances() {
foreach (self::$instances as $name => $instance) {
//Do Something Here
}
}
Еще одно замечание, я бы не сделал конструктор приватным.Это сделает невозможным расширение или проверку должным образом.Вместо этого сделайте его защищенным, чтобы при необходимости вы могли создавать подклассы и при этом работать с родителем ...