Объекты в PHP, включая другие объекты - PullRequest
0 голосов
/ 22 января 2010

Я думаю, что заголовок правильный, но, пожалуйста, поправьте меня, если он ошибочен.

Проблема: у меня есть класс, который хочет использовать класс DB, теперь вместо того, чтобы "global $ db;" в каждом методе я хочу использовать объект БД, в котором я хочу разместить ссылку на объект в свойствах моего класса.

Все еще следите? ОК, здесь идет:

class user
{
    private $id = 0;
    private $name = NULL;
    private $password = NULL;
    private $db;

    function __construct()
    {
        $this->load_db();
    }

    private function load_db()
    {
        global $db;
        $this->$db =& $db;
    }

Я получаю сообщение об ошибке «Объект класса db не может быть преобразован в строку», что раздражает, так как я не могу понять, как установить тип var в PHP ...

Теперь мой вопрос в два раза:

1) Как мне это исправить. или же 2) Есть ли лучший способ сделать это, так как это выглядит действительно "скупыми руками".

Заранее спасибо,

Dorjan

edit: Просто чтобы убедиться, что я ясен, я не хочу делать несколько экземпляров одного и того же объекта БД. По крайней мере, я считаю, что это хорошая практика ^, ^

Ответы [ 6 ]

2 голосов
/ 22 января 2010

Тебе лучше сделать

class User
{
    private $id = 0;
    private $name = NULL;
    private $password = NULL;
    private $db;

    function __construct($db=null)
    {
        $this->db = $db;
    }

}

Обратите внимание, что вы не ставите $ перед именами переменных, если вы обращаетесь к свойствам через $object->. То есть, откуда произошла ошибка.

Использовать глобальный метод внутри класса - это очень плохая практика, так как вы каким-то образом привязываете свой класс к этой глобальной переменной. Лучше передать его в качестве параметра конструктору или методу.

Позже вы можете создать экземпляр класса с помощью

$user = new User($db)

Также обратите внимание, что имена классов по соглашению начинаются с заглавной буквы.

2 голосов
/ 22 января 2010
private function load_db()
{
        global $db;
        $this->db =& $db;
}

Также, если вы используете php 5, вам не нужно использовать оператор =&, поскольку объекты неявно передаются по ссылке. Во-вторых, вы должны внедрить $db в конструктор или извлечь его из объекта Registry вместо использования global.

2 голосов
/ 22 января 2010

Если вы используете $ this, вам нужен только один знак доллара. Так что $this->db.

1 голос
/ 22 января 2010

Yopu захочет использовать то, что называется внедрение зависимостей . Здесь вы «внедряете» объект в другой объект, чтобы делать то, что делает объект. В этом случае делайте базу данных

класс пользователя { личное $ id = 0; личное $ name = NULL; private $ password = NULL; личное $ db;

function __construct($database_object)
{
    $this->load_db();
    $this->$db = $database_object;
}

public function do_db_stuff()
{
    $this->$db->doStuff();
}    

$db = new Mysql() 
$user = new User($db);
$user->do_db_stuff();
1 голос
/ 22 января 2010

Внедрить экземпляр БД через конструктор

public function __construct($db)
{
    $this->db = $db;
}
1 голос
/ 22 января 2010

Это:

$this->db
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...