2012-01-13 2 views
0

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

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

решаемые! Спасибо за всю помощь, ребята!

ответ

1

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

protected static $fetcher; 

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

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

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(); 
?> 
+0

Если вы хотите глобальных одноплодных изменения 'самости :: $ _ экземпляр = новый статические();' – Xeoncross

+0

Потрясающий. Благодаря! – yoaquim

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; 
     } 
    } 
?> 
1

Вы можете просто прочитать общие шаблоны дизайна на сайте PHP. Есть очень хорошие примеры с хорошей документацией:

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

Else, одноэлементно это просто метод, который возвращает один единственный экземпляр себе:

class MySingletonClass { 

    private static $mySingleton; 

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

} 
0
class MyClass { 

    private static $instance; 

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

     return self::$instance; 
    } 

} 

Затем вызова получить экземпляр с помощью MyClass :: деЫпзЬапсе();

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

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

В основном реализуешь одноплодный шаблон означает написание класса с собственным конструктором и статическим методом, чтобы построить себя.Также проверьте 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 
Смежные вопросы