PHP5, что не так с моим синтаксисом? - PullRequest
0 голосов
/ 09 января 2011

Я никогда раньше не развивался, и я немного озадачен, что не так с моим синтаксисом здесь?

private static $instance; //holder of Mongo_Wrapper
public $connected = true; 
private $mongo = null; // The mongo connection affiliation
private $database = null; // The database we are working on

с этой функцией:

        public function mongo_connect($db_name) {
            if (! self::connected) {
                $this->mongo = new Mongo;
                //TODO: error handle this whole sharade: throw new Kohana_Database_Exception('Cant connect', NULL, 503);
                $this->connected = true;
            }

            $this->database = $this->mongo->$db_name; //set the database we are working on

            return $connected;
        }

Яизвините, wmd-редактор отправляет мне адский код.

Спасибо!

edit: $ подключено не статично, проблема в том, что это не такработает либо со статическим, либо с $ this. Кроме того, это одноэлементный класс, я не знаю, важно это или нет.

edit: это остальная часть кода, здесь selfи это работало правильно:

public static function singleton($db_name) {
            if (!isset(self::$instance)) {
                $c = __CLASS__;
                $this->$instance = new $c;
            }
            self::mongo_connect($db_name);
            return self::$instance;
        }
enter code here

Ответы [ 3 ]

2 голосов
/ 09 января 2011
if (! self::connected) {

является , вероятно, причиной вашей ошибки. Вы используете self только тогда, когда пытаетесь получить доступ к статическим членам класса (который не подключен), и вы должны использовать $ -Sign в начале, в противном случае вы запрашиваете константу класса. Поэтому вы должны либо объявить подключенный как статический, либо использовать $ this-> для доступа к нему.

Взгляните на статических членов класса в руководстве по PHP!

Кроме того, вы должны действительно попытаться понять, как работает ООП, прежде чем писать такой код. PHP говорит, что вы не можете использовать $ this, потому что вы не находитесь в контексте объекта , что означает, что вы никогда не создавали экземпляр объекта, используя new .

Может быть, Основы PHP ООП помогут вам.

К сожалению, PHP позволяет вам вызывать методы статически, которые на самом деле не являются, что может быть причиной ошибки здесь. Но рано или поздно (вероятно, рано) вам все равно придется разбираться в основах ООП, поэтому поиграйтесь с несколькими простыми классами, прежде чем пытаться писать код для продуктивного использования.

Также взгляните на этот пример реализации шаблона Singleton .

Если вам нужна дополнительная помощь по этому вопросу, пожалуйста, покажите нам, как вы вызываете метод connect!

Там у нас есть ваша проблема. Вы делаете следующее:

self::mongo_connect($db_name);

Что означает "статически вызывать mongo_connect для себя". Что вам действительно нужно сделать, это:

self::$instance->mongo_connect();

Что эквивалентно «вызову mongo_connect для единственного экземпляра self».

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

$this->$instance = new $c;

Неправильно во многих отношениях ... Не только потому, что вы используете $ this в статическом контексте, но и потому, что вы назначаете созданный экземпляр члену класса с именем, которое * содержится в $ экземпляр, который кажется пустым ... Понятия не имею, как это на самом деле может работать ...

0 голосов
/ 09 января 2011

х3ро прав. Вам также понадобится $ this-> подключенный синтаксис в конце:

return $this->connected;

Если вы получаете сообщение об ошибке, когда используете $ this-> connected, это потому, что ваша функция не метод класса, а глобальная функция.

0 голосов
/ 09 января 2011

self следует использовать со статическими элементами (используйте $this->connected вместо self::connected).

UPDATE
private static function mongo_connect($db_name, $instance)<br> {<br> if (!$instance->connected) {<br> ....<br> }<br> ...<br> return $instance->connected;<br> }

public static function singleton($db_name) {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        self::mongo_connect($db_name, self::$instance );
        return self::$instance;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...