php 5.3 subclass singleton

for the "Late Static Bindings" imported by php from version 5.3,([url]http://php.net/manual/en/language.oop5.late-static-bindings.php[/url])
singleton patterns:


<?php
class Singleton {

static private $instance;

protected static function create(){
if(is_null(self::$instance)){
self::$instance = new self();
}
return self::$instance;
}
static public function instance(){
return static::create(); //!important to use static

}

public function __construct(){echo 1;}

}

class MySingleton extends Singleton {
static private $instance; //in subclass,explicitly declare this and the method below
protected static function create(){
if(is_null(self::$instance)){
self::$instance = new self();
}
return self::$instance;
}

}
class YourSingleton extends Singleton {
static private $instance;
protected static function create(){
if(is_null(self::$instance)){
self::$instance = new self();
}
return self::$instance;
}
}
class ThirdSingleton extends MySingleton {
static private $instance;
protected static function create(){
if(is_null(self::$instance)){
self::$instance = new self();
}
return self::$instance;
}
}
echo get_class(Singleton::instance()); //=>Singleton
echo get_class(MySingleton::instance()); //=> MySingleton
echo get_class(MySingleton::instance()); //=> MySingleton
echo get_class(YourSingleton::instance()); //=>YourSingleton
echo get_class(ThirdSingleton::instance()); //=>ThirdSingleton
echo get_class(ThirdSingleton::instance()); //=>ThirdSingleton




a code-less but confusable style:

<?php
class Singleton {

static private $instance;

static public function instance(){
static $instance = null; //should not add self:: or static:: here

return $instance ?: $instance = new static;
}

public function __construct(){echo 1;}

}

class MySingleton extends Singleton {
}
class YourSingleton extends Singleton {
}
class ThirdSingleton extends MySingleton {
}
echo get_class(Singleton::instance()); //=>Singleton
echo get_class(MySingleton::instance()); //=> MySingleton
echo get_class(MySingleton::instance()); //=> MySingleton
echo get_class(YourSingleton::instance()); //=>YourSingleton
echo get_class(ThirdSingleton::instance()); //=>ThirdSingleton
echo get_class(ThirdSingleton::instance()); //=>ThirdSingleton


the following maybe the best one:

class Singleton {

static protected $instance; //should not be private

static public function instance(){
if(is_null(static::$instance)){ //important to use static
static::$instance = new static();
}
return static::$instance;

}

public function __construct(){echo 1;}

}

class MySingleton extends Singleton {
static protected $instance; //must explicitly declared
}
class YourSingleton extends Singleton {
static protected $instance;
}
class ThirdSingleton extends MySingleton {
static protected $instance;
}
echo get_class(Singleton::instance()); //=>Singleton
echo get_class(MySingleton::instance()); //=> MySingleton
echo get_class(MySingleton::instance()); //=> MySingleton
echo get_class(YourSingleton::instance()); //=>YourSingleton
echo get_class(ThirdSingleton::instance()); //=>ThirdSingleton
echo get_class(ThirdSingleton::instance()); //=>ThirdSingleton
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值