Как я могу создать синглтон в PHP? - PullRequest
0 голосов
/ 14 января 2012

Я использую PDT и Aptana в Eclipse Indigo с PHP 5.3 и хочу создать синглтон в классе.

Под синглтоном я имею в виду, что я хочу иметь только один экземпляр этого объекта, а другие объекты или классы получить этот единственный экземпляр через функцию, которая возвращает этот объект (так что это будет означать, что я пытаюсьсоздать объект в классе, который определяет этот объект, то есть: создать 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 ]

3 голосов
/ 14 января 2012

попробуйте это:

<?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 голос
/ 14 января 2012

В основном реализация одноэлементного шаблона означает написание класса с закрытым конструктором и статическим методом для построения самого себя.Также проверьте сайт PHP на это: http://www.php.net/manual/en/language.oop5.php и 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
1 голос
/ 14 января 2012

Alse определить __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);
    }
}
1 голос
/ 14 января 2012

Опираясь на ответ @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');
1 голос
/ 14 января 2012

Возможно, вы захотите просто прочитать общие шаблоны дизайна на сайте 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;
    }

}
1 голос
/ 14 января 2012

Вы не можете назначить свойство класса в PHP таким образом. Это должен быть скаляр, или значение массива, или свойство должно быть установлено в вызове метода.

protected static $fetcher;

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

Также обратите внимание, что я не использовал $this->, поскольку это работает только для экземпляров объекта. Для работы со статическими значениями необходимо использовать self:: при работе в области видимости класса.

0 голосов
/ 14 января 2012
class MyClass {

    private static $instance;

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

        return self::$instance;
    }

}

Затем вызовите экземпляр get, используя MyClass :: getInstance ();

0 голосов
/ 14 января 2012
<?php
   class MyObject {
      private static $singleInstance;
      private function __construct() {
        if(!isset(self::$singleInstance)) {
           self::$singleInstance = new MyObject;
        }
      }
      public static function getSingleInstance() {
         return self::$singleInstance;
      }
   }
?>
...