How can I create a singleton in PHP?

老子叫甜甜 提交于 2019-12-25 11:46:26

问题


I'm using PDT and Aptana on Eclipse Indigo with PHP 5.3 and I want to create a singleton in a class.

By singleton, I mean I want to just have one instance of that object, and for other objects or classes to get that single instance via a function that returns that object (so this would mean I'm trying to create an object within the class that defines that object, ie: creating objA within the class objA)

I understand you can't just go a head and do this:

public $object = new Object();

with in a class definition, you have to define it in the constructor.

How can I go ahead and do this? I'm coming from Java, so it could be I'm confusing some basic stuff. Any help is greatly appreciated. Here's the code:

<?php
  class Fetcher{

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

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

Solved! Thanks for all the help guys!


回答1:


try this:

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

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

        return self::$_instance;
    }
}
?>

and call it with:

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



回答2:


You cannot assign a class property in PHP like that. It must be a scalar, or array value, or the property must be set in a method call.

protected static $fetcher;

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

Also, notice that I did not use $this->, as that only works for object instances. To work with static values you need to use self:: when working within the class scope.




回答3:


You might want to just read common design patterns on the php site. There are pretty good examples with good documentation:

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

Else, a singleton is simply a method that returns one single instance of itself:

class MySingletonClass {

    private static $mySingleton;

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

}



回答4:


Building on @periklis answer you might want separate singletons for different application scopes. For example, lets say you want a singleton of a database connection - fine. But what if you have TWO databases you need to connect too?

<?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');



回答5:


Alse define __clone method

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);
    }
}



回答6:


Basically implementing a singleton pattern means writing a class with a private constructor and a static method to build itself. Also check PHP site for it: http://www.php.net/manual/en/language.oop5.php and http://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



回答7:


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



回答8:


class MyClass {

    private static $instance;

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

        return self::$instance;
    }

}

Then call get instance using MyClass::getInstance();



来源:https://stackoverflow.com/questions/8856755/how-can-i-create-a-singleton-in-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!