class A{
private function __construct(){}
}
通过将构造函数标记为私有化,该类已经不能通过new实例化了,那么我们如何访问类中的方法呢? 只需将类中的方法修饰为静态方法,那么我们就可以在外部调用了。
class A{
private function __construct(){}
public static function getInstance(){
echo '调用静态方法,类不需经过实例化。';
}
}
A::getInstance(); //调用静态方法,类不需经过实例化。
现在我们已经可以访问到该类中的方法了,那么我们只需在类中实例化本身,并把实例的对象标识为静态变量,这样就可以保持该类实例的唯一性了。
class A{
private static $_instance; //类的实例
private function __construct(){}
public static function getInstance(){
if (!(self::$_instance instanceof self)){ //判断类是否已经实例化
self::$_instance = new self();
}
return self::$_instance; //返回唯一实例
}
public function F(){
return 'A';
}
}
$A = A::getInstance();
echo $A->F(); //A
以上代码基本可以达到我们的需求了,但还有个问题PHP语言是可以克隆对象的,为了防止对象被克隆从而破坏单一职责还需用将魔术方法__clone()标识为private,防止被clone。
class A{
private static $_instance; //类的实例
private function __construct(){}
public static function getInstance(){
if (!(self::$_instance instanceof self)){ //判断类是否已经实例化
self::$_instance = new self();
}
return self::$_instance; //返回唯一实例
}
private function __clone(){}
public function F(){
return 'A';
}
}