澄清:
我没有任何实际或支持PHP4的实际经验,但我最近不得不改变我的类,所以它支持PHP4和PHP5。
__construct
方法,不是吗? (并将其功能体移动到Conf功能)。self
吗?我不确定它的PHP4支持。<?php
class Conf {
function Conf( $filename ) {
$this->__construct( $filename );
}
function __construct( $filename ) {
echo $filename;
}
function getInstance( $filename ) {
static $instance = null;
if ( $instance == null ) {
$instance = new Conf( $filename );
}
return $instance;
}
}
$x = Conf::getInstance( 'file.xml' );
答案 0 :(得分:1)
要解决PHP4中self
不可用的问题,您应该将getInstance
方法更改为以下内容:
class Conf {
function Conf( $filename ) {
$this->__construct( $filename );
}
function getInstance( $filename ) {
static $instance = null;
if ( $instance == null ) {
$class = __CLASS__;
$instance = new $class( $filename );
}
return $instance;
}
// Don't forget to block cloning
function __clone() {
trigger_error("Cannot clone a singleton", E_USER_WARNING);
}
}
编辑:因为__CLASS__
将始终是定义函数的类的类名,所以为了支持继承,必须在每个子类中重新定义getInstance
方法。
class Conf2 extends Conf {
function newMethod() { echo "Do something"; }
function getInstance( $filename ) {
static $instance = null;
if ( $instance == null ) {
$instance = new self($filename);
}
return $instance;
}
}
这是一个拖累,是的,但是如果你使用上面的方法,你可以复制和粘贴。我相信这已在PHP 5.3中使用late static binding修复,但我尚未安装它以确认。
答案 1 :(得分:0)
您的代码不必要地复杂。如果你有另一个,你根本不需要__construct方法。 (反之亦然,但旧版本的php不支持__construct)
另外,要正确实现单例模式,静态实例应该是类范围,构造函数应该是私有的。
class Singleton {
private static $instance;
private function Singleton(){
//do stuff
}
function getInstance(){
if(self::$instance == null){
self::$instance = new Singleton();
}
return self::$instance;
}
}
This article描述了如何在PHP4中实现Singleton模式,这是一个问题。