21,886
社区成员
发帖
与我相关
我的任务
分享
class Singleton {
protected static $instance;
protected function __construct() { }
final public static function getInstance() {
if (!isset(static::$instance)) {
static::$instance = new static();
}
return static::$instance;
}
final private function __clone() { }
class CApp extends CSingleton{
protected function __construct(){
echo "Enter CApp construct"; //这里可以正常进入,也可以调用非静态成员函数
}
public function InitApp(){
// do something init
}
}
$app = CApp::instance();
$app->InitApp(); // 执行到这一句就报错了,错误是call member function from non-object.
class Singleton
{
private static $instances = array();
protected function __construct() {}
protected function __clone() {}
public function __wakeup()
{
throw new Exception("Cannot unserialize singleton");
}
public static function getInstance()
{
$cls = get_called_class(); // late-static-bound class name
if (!isset(self::$instances[$cls])) {
self::$instances[$cls] = new static;
}
return self::$instances[$cls];
}
}
// 测试例子
class Foo extends Singleton {}
class Bar extends Singleton {}
echo get_class(Foo::getInstance()) . "\n";
echo get_class(Bar::getInstance()) . "\n";
感谢各位版主的精彩回答!
static::$instance=static(); //写成static::$instance==static();
//直接把赋值语句变成条件语句了,所以是none-object.
//因为静态属性的原因,继承已无意义了。是什么意思。
//我实际上每个单例派生类都有自己的私有成员和成员函数。
//你上面的代码是不是也有笔误啊?实际应该是
$app1 = CApp1::getinstance();
$app1->InitApp();
//这样输出就是CApp1了吧
<?php
class Singleton {
protected static $instance;
protected function __construct() { }
final public static function getInstance() {
if (!isset(static::$instance)) {
static::$instance = new static();
}
return static::$instance;
}
final private function __clone() { }
}
class CApp extends Singleton{
protected function __construct(){
echo "Enter CApp construct"; //这里可以正常进入,也可以调用非静态成员函数
}
public function InitApp(){
echo 'do sth';
}
}
$app = CApp::getInstance();
$app->InitApp();
?>
class CApp1 extends CSingleton{
protected function __construct(){
echo "Enter CApp1 construct\n";
}
}
$app1 = CApp::getinstance();
//$app->InitApp();
print_r($app1);
CApp Object
(
)
就出麻烦了
因为静态属性的原因,继承已无意义了class CSingleton {
protected static $instance;
protected function __construct() { }
final public static function getInstance() {
if (!isset(static::$instance)) {
static::$instance = new static();
}
return static::$instance;
}
final private function __clone() { }
}
class CApp extends CSingleton{
protected function __construct(){
echo "Enter CApp construct\n";
}
public function InitApp(){
echo __METHOD__ . PHP_EOL;
}
}
$app = CApp::getinstance();
$app->InitApp();
Enter CApp construct
CApp::InitApp
没有问题,php 5.4.31