更改子类的受保护变量的值

时间:2011-07-27 13:31:16

标签: php oop inheritance

我正在尝试做一些我认为非常简单的事情,但由于我对PHP中的OOP相对较新,我遇到了一些麻烦。

这是我的代码:

<?php
class MyClass
{
    protected $variable = 'DEFAULT';

    function __construct($newVariable)
    {
        $this->variable = $newVariable;
        echo $this->variable;
    }
}
class OtherClass extends MyClass
{
    function __construct()
    {
        echo $this->variable;
    }
}

$foo = new MyClass('MODIFIED'); // Output : MODIFIED
$bar = new OtherClass(); // Output : DEFAULT
?>

我搜索了很多不同的主题和网站,但还没有找到我如何将$ variable的重新定义值传递给子类。 有人可以指导我吗?如果有办法的话。

提前致谢。

编辑澄清脚本中实际发生的事情我遇到了这个问题: 我有一个创建表单的类,在该类中有几个变量告诉我们在什么环境中的函数:如果它是一个多语言形式,如果我想要一个简单的形式或一个结构化的形式,这样的参数。 其中一些环境变量是通过类的执行来修改的。

现在,由于我的页面的需要,我有一个专门用于创建“选择”字段的子类。它继承了主类的核心功能来创建字段等,但子类需要多个参数。 事实上,我仍然希望select类继承主类中的environnement参数,处于它们所处的状态。

当我输入它时,我意识到我接近它的方式可能不是正确的方法,因为当我查看我的代码时,我认为可能有另一种方法可以做到这一点。在我的代码中,我有两个对象,我需要它只有一个,但我真的不知道如何实际放置它。

6 个答案:

答案 0 :(得分:3)

您没有重新定义变量,只需在父构造函数中设置它。打电话给你,你得到了你需要的东西(见代码中的评论,只有一行):

<?php
class MyClass
{
    protected $variable = 'DEFAULT';

    function __construct($newVariable)
    {
        $this->variable = $newVariable;
        echo $this->variable;
    }
}
class OtherClass extends MyClass
{
    function __construct()
    {
        parent::__construct(); # <<--- do this
        echo $this->variable;
    }
}

$foo = new MyClass('MODIFIED'); // Output : MODIFIED
$bar = new OtherClass(); // Output : MODIFIED
?>

即使您有两个类定义,具体实例也将始终属于一个类。一个类可以从父类继承,但如果重写方法(就像使用构造函数一样),则不会调用父类方法,因为它已被覆盖。但是,使用parent关键字,您可以从子级中访问父级方法。

答案 1 :(得分:1)

MyClass中重写了OtherClass的构造函数。父构造函数隐式自动运行。如果您还要运行父构造函数,请在parent::__construct()中调用OtherClass::__construct

你当然会遇到问题,因为MyClass::__construct需要一个参数而OtherClass::__construct没有参数。如此,你是如何期待价值改变的??

答案 2 :(得分:1)

子类仅继承方法和默认变量。如果您启动新实例,它不会继承根类的属性,因为$foo$bar是两个不同的对象。

您必须执行$bar = new OtherClass("MODIFIED");,然后将parent::__construct($newVariable)添加到第二个__construct。 (和相应的参数)

基本上,你不能指望一个新实例(与$ foo平行的实例)“神奇地”继承原始$ foo中的修改后的实例。你必须找到一种方法来传递它(因此,调用父构造函数)。

答案 3 :(得分:0)

您需要在子类中添加对parent的调用:

function __construct()
{
    parent::__construct();
    echo $this->variable;
}

您可以使用任何功能执行此操作:

function doSomethingAWESOME()
{
    parent::doSomethingAWESOME();
    echo "I think that was awesome";
}

基本上,该陈述相当于,“你知道在我超越它之前你将在父类中做的所有事情吗?是的,在这里做。”

也很酷:

function doSomethingAWESOME()
{
    echo "NEVER!!!";
}

function parentSomethingAwesome()
{
    // calls the parent class's definition of some doSomethingAWESOME
    parent::doSomethingAWESOME();
}

答案 4 :(得分:0)

你想要做的事情是不可能的:$ foo和$ bar是你的类的实例,所以它们之间没有链接。

使用建筑类比,你的两个班级就像建筑计划:房子的计划,以及带车库的房子的计划。你想要做的就像你建造一个房子(一个实例一个类),在里面放一些床(设置一些变量),当你用车库建造另一个房子时,你想要同样的床。它不会发生。

答案 5 :(得分:0)

基本上,另一个类不会通过父类中的构造继承更新。

您也只需在子类中传递'MODIFIED' arg并使用Construct对其进行初始化。因为 foo bar 是两个不同的实例(属于同一类),但是它们没有链接在一起。