Использование родительских переменных в расширяющем классе - PullRequest
0 голосов
/ 14 июля 2009

У меня есть три класса MainClass, Member и Project. Участник и Проект расширяют MainClass.

Сначала я создаю объект MainClass, затем объект Member и выполняю функцию setMember:

$mainclass = new MainClass();
$member = new Member($id);
$mainclass->setMember($member);

Когда переменная $ member установлена ​​на текущий член, я хочу использовать эту переменную в своем классе Project, но не могу заставить ее работать: s

Мне нужен идентификатор участника, поэтому в теории есть две возможности:

mysql_query("INSERT INTO projects (title, user_id) VALUES('$title', ".$this->member->id.")");

или

mysql_query("INSERT INTO projects (title, user_id) VALUES('$title', ".$this->member->getId().")");

Первый, $ this-> member-> id, приводит к NULL

Второй, $ this-> member-> getId (), выдаёт мне эту ошибку:

вызов функции-члена getId () для необъект в ....

Вот мои уроки (большую часть этого я лишил)

class MainClass{
    public $member = NULL;

    public function __construct(){}

    public function setMember($member)
    {
        $this->member = $member;
    }

    public function getMember()
    {
        return $this->member;
    }
}

class Project extends MainClass{
    public $id;

    public function __construct($id=NULL){
        $this->setId($id);
    }

    public function setId($id){
        $this->id = $id;
    }

    public function getId(){
        return $this->id;
    }

    public function addProject($title){
        mysql_query("INSERT INTO projects (title, user_id) VALUES('$title', ".$this->member->getId().")");
    }
}

class Member extends MainClass{
    public $id;

    public function __construct($id=NULL){
        $this->setId($id);
    }

    public function setId($id){
        $this->id = $id;
    }

    public function getId(){
        return $this->id;
    }       
}

Ответы [ 3 ]

2 голосов
/ 14 июля 2009

Сделайте шаг назад и посмотрите на отношения между вашими классами. В вашей базе данных у проекта есть «член» (или «пользователь» в БД).

Ваши реализации класса не отражают эту связь. У MainClass есть член, но у Project нет. Вы используете член базового класса для создания этих отношений.

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

Как я уже сказал, сделайте шаг назад и посмотрите на отношения. Они обычно следуют отношениям в вашей схеме базы данных? Почему Участник и Проект происходят из MainClass? Каково их общее поведение?

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

Надеюсь, это поможет.

0 голосов
/ 14 июля 2009

У вас двое детей, расширяющих родительский класс, но дочерние классы не могут "видеть" друг друга в частной или публичной форме. Вам необходимо импортировать данные в класс Project.

0 голосов
/ 14 июля 2009

Вместо создания экземпляра MainClass необходимо создать экземпляр Project.

$mainclass = new Project();
$member = new Member($id);
$mainClass->setMember($member);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...