2009-07-14 2 views
0

У меня есть три класса MainClass, Member и Project. Участник и проект расширяют MainClass.Использование родительских переменных в расширяющемся классе

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

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

Когда переменный $ члена устанавливаются в настоящее время члена я хочу использовать этот переменный в моем классе проекта, но Я не могу заставить его работать: 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-> как принадлежность> идентификатор, результаты NULL

Второй, $ this-> как принадлежность> GetId(), дает мне эту ошибку:

Call to a member function getId() on a non-object in ....

Вот мои классы (я раздел большинство из них Offcourse)

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; 
    }  
} 
+0

У вас есть опечатки в первом наборе кода, который вы вставили - Mainlass(); и setMember ($ member) - должно быть $ Member. – jimyi

+0

только что скорректировал их спасибо – Bundy

+0

Что делает print_r ($ mainClass), показывая вам сразу после вызова setMember ($ member)? – AndyMcKenna

ответ

0

Вместо создания экземпляра MainClass, вы должны создать экземпляр Project.

$mainclass = new Project(); 
$member = new Member($id); 
$mainClass->setMember($member); 
+0

Я создаю экземпляр проекта, но его не касается моего вопроса, поэтому я не публиковал его. Мне нужно иметь доступ к объекту-члену, который я установил в MainClass через Project – Bundy

+0

, используя «новый проект» вместо «нового MainClass», и добавление $ mainclass-> addProject ('foo'); ваш примерный код работает для меня без ошибок/предупреждений/уведомлений. – VolkerK

0

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

2

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

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

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

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

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

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

+0

Я бы добавил, что он сильно не справился с дизайном. Родитель не должен работать с детьми, так как у ребенка есть все, что есть у родителя, но он передает ребенку (члену) родителю. Он мог выполнять ту же операцию внутри самого ребенка. – usoban

+0

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

+0

Я думаю, что у вас проблемы с разницей между классами и экземплярами. Участник и проект оба происходят из MainClass. Если вы создаете экземпляр Member, а затем создаете экземпляр MainClass и вызываете setMember(), теперь только этот PARTICULAR экземпляр MainClass имеет заданное поле $ member - любой другой экземпляр MainClass, Project или Member НЕ будет способный видеть это поле, потому что у всех их есть своя «личная» копия, и она не установлена. Чтобы сделать то, что вы пытаетесь сделать, вам нужно создать экземпляр Project, называть его setMember(), а затем addProject() должен работать. – pjbeardsley

Смежные вопросы