如何在PHP中创建单例?

时间:2012-01-13 20:23:30

标签: php eclipse singleton aptana eclipse-pdt

我在Eclipse Indigo和PHP 5.3上使用PDT和Aptana,我想在一个类中创建一个单例。

通过singleton,我的意思是我只想拥有该对象的一个​​实例,并且其他对象或类通过返回该对象的函数获取该单个实例(所以这意味着我正在尝试创建一个对象在定义该对象的类中,即:在类objA中创建objA)

我知道你不能只是去做这件事:

public $object = new Object();

在类定义中,您必须在构造函数中定义它。

我怎样才能继续这样做?我来自Java,所以我可能会混淆一些基本的东西。任何帮助是极大的赞赏。这是代码:

<?php
  class Fetcher{

    private static $fetcher = new Fetcher(); //this is where I get the unexpected "new" error

    static function getFetcherInstance(){ 
      return $this->$fetcher;
    }
  }
?>

解决!感谢所有帮助人员!

8 个答案:

答案 0 :(得分:3)

试试这个:

<?php
class myclass{
    private static $_instance = null;

    public static function getInstance() {
        if (self::$_instance === null) {
            self::$_instance = new myclass();
        }

        return self::$_instance;
    }
}
?>

并将其命名为:

<?php
$obj = myclass::getInstace();
?>

答案 1 :(得分:1)

您不能像这样在PHP中分配类属性。它必须是标量或数组值,或者必须在方法调用中设置属性。

protected static $fetcher;

static function getFetcherInstance(){ 
    if (!self::$fetcher) {
        self::$fetcher = new Fetcher();
    }
    return self::$fetcher;
}

另外,请注意我没有使用$this->,因为它只适用于对象实例。要使用静态值,您需要在类范围内工作时使用self::

答案 2 :(得分:1)

您可能只想阅读php网站上的常见设计模式。有很好的例子和良好的文档:

http://www.php.net/manual/en/language.oop5.patterns.php

否则,单例只是一个返回其自身的单个实例的方法:

class MySingletonClass {

    private static $mySingleton;

    public function getInstance(){
        if(MySingletonClass::$mySingleton == NULL){
            MySingletonClass::$mySingleton = new MySingletonClass();
        }
        return MySingletonClass::$mySingleton;
    }

}

答案 3 :(得分:1)

在@periklis回答的基础上,您可能需要针对不同应用范围的单独的单例。例如,假设您想要一个数据库连接的单例 - 很好。但是,如果您还需要连接两个数据库呢?

<?php
class Singleton
{
    private static $instances = array();

    public static function getInstance($name = 'default')
    {
        if ( ! isset(static::$instances[$name]))
        {
            static::$instances[$name] = new static();
        }

        return static::$instances[$name];
    }
}


Class DB extends Singleton {}


$db_one = DB::getInstance('mysql');
$db_two = DB::getInstance('pgsql');

答案 4 :(得分:1)

另外定义__clone方法

class Fetcher {

    protected static $instance;

    private function __construct() {
        /* something */
    }

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new Fetcher();
        }
        return self::$instance;
    }

    private function __clone() {
        /* if we want real singleton :) */
        trigger_error('Cannot clone', E_USER_ERROR);
    }
}

答案 5 :(得分:1)

基本上实现单例模式意味着用私有构造函数和静态方法编写一个类来构建自己。还要检查PHP站点:http://www.php.net/manual/en/language.oop5.phphttp://it2.php.net/manual/en/book.spl.php

class A {
protected $check;
private function __construct($args) {
}
static public function getSingleton($args) {
    static $instance=null;
    if (is_null($instance)) {
        $instance=new A();
    }
    return $instance;
}
public function whoami() {
    printf("%s\n",spl_object_hash($this));
}
}
$c=A::getSingleton("testarg");
$d=A::getSingleton("testarg");
$c->whoami(); // same object hash
$d->whoami(); // same object hash
$b= new A("otherargs"); // run time error

答案 6 :(得分:0)

<?php
   class MyObject {
      private static $singleInstance;
      private function __construct() {
        if(!isset(self::$singleInstance)) {
           self::$singleInstance = new MyObject;
        }
      }
      public static function getSingleInstance() {
         return self::$singleInstance;
      }
   }
?>

答案 7 :(得分:0)

class MyClass {

    private static $instance;

    public static function getInstance() {
        if( !isset( self::$instance ) ) {
            self::$instance = new self();
        }

        return self::$instance;
    }

}

然后使用调用get实例 MyClass的::的getInstance();