PHP4中的单例模式+ __construct

时间:2009-11-23 20:41:19

标签: php singleton

澄清:

  • 不,我不能制作这个纯PHP5
  • 是的,这段代码适用于PHP 4.3.9。

我没有任何实际或支持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' );

2 个答案:

答案 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模式,这是一个问题。