在扩展类中使用父变量

时间:2009-07-14 16:07:04

标签: php oop class extends

我有三个类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(),给我这个错误:

  

在a上调用成员函数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 个答案:

答案 0 :(得分:2)

退一步看看你班级之间的关系。在您的数据库中,项目“有一个”成员(或数据库中的“用户”)。

您的类实现不反映这种关系。 MainClass“有一个”会员,但Project没有。您正在使用基类的成员来创建此关系。

除非MainClass中的$ member是静态的,否则Project的一个实例无法看到MainClass的另一个实例为它设置了什么,因为它们是单独的实例。我不建议将$ member设为static,因为你基本上就像使用全局变量一样使用它。

就像我说的那样,退一步看看关系。它们通常是否遵循数据库模式中的关系?为什么会员和项目来自MainClass?他们的共同行为是什么?

我意识到我提出的问题比我回答的要多,但我的直觉反应是,这个特殊的技术问题不是你真正的问题 - 这是你的课堂设计需要重新考虑一点。

希望有所帮助。

答案 1 :(得分:0)

您应该创建MainClass的实例,而不是创建Project的实例。

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

答案 2 :(得分:0)

您有两个孩子延伸父母,但子课程不能互相“看到”私人或公共。您需要将数据导入Project类。