【问题标题】:Using parent variables in extending class在扩展类中使用父变量
【发布时间】:2009-07-14 16:07:04
【问题描述】:

我有三个类 MainClass、Member 和 Project。 Member 和 Project 扩展 MainClass。

首先我创建一个 MainClass 对象,然后创建一个 Member 对象并执行函数 setMember:

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

当 $member 变量设置为当前成员时,我想在我的 Project 类中使用这个变量,但我无法让它工作:s

我需要会员的 id 所以理论上有两种可能:

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

【问题讨论】:

  • 你在第一组代码中有错别字 - Mainlass();和 setMember($member) - 应该是 $Member。
  • 调用 setMember($member) 后 print_r($mainClass) 会显示什么?

标签: php oop class extends


【解决方案1】:

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

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

除非 MainClass 中的 $member 是静态的,否则 Project 的实例无法看到 MainClass 的另一个实例为其设置了什么,因为它们是单独的实例。我不建议将 $member 设为静态,因为您实际上会将其用作全局变量。

就像我说的,退后一步,看看关系。他们通常遵循您的数据库模式中的关系吗?为什么 Member 和 Project 派生自 MainClass?他们的共同行为是什么?

我意识到我问的问题比我回答的要多,但我的直觉是这个特定的技术问题并不是你真正的问题——而是你的类设计需要重新思考一下。

希望对您有所帮助。

【讨论】:

  • 我要补充一点,他在设计方面几乎失败了。父母不应该与孩子一起工作,因为孩子自己拥有父母所拥有的一切,但他将孩子(成员)传递给父母。他可以自己在孩子体内做同样的操作。
  • 我真的不明白为什么我失败了。这些类只是一个例子。我只想使用我在主类、子类 Project 中设置的成员对象,或者这不可能吗?
  • 我认为你在类和实例之间的区别上遇到了麻烦。 Member 和 Project 都派生自 MainClass。如果创建 Member 实例,然后创建 MainClass 实例并调用 setMember(),现在只有 MainClass 的特定实例具有它的 $member 字段集——MainClass、Project 或 Member 的任何其他实例都不会能够看到该字段,因为他们都有自己的“个人”副本并且没有设置。要做你想做的事,你需要创建一个 Project 的实例,调用它的 setMember(),然后 addProject() 应该可以工作。
【解决方案2】:

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

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

【讨论】:

  • 我确实创建了一个 Project 实例,但它与我的问题无关,所以我没有发布它我需要能够访问我通过 Project 在 MainClass 中设置的成员对象
  • 使用“new Project”而不是“new MainClass”并添加 $mainclass->addProject('foo');您的示例代码对我有用,没有错误/警告/通知。
【解决方案3】:

您有两个孩子扩展了父母,但孩子们不能“看到”彼此私人或公共。您需要将数据导入到 Project 类中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2020-04-09
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多