Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 更改子类的受保护变量的值_Php_Oop_Inheritance - Fatal编程技术网

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

Php 更改子类的受保护变量的值,php,oop,inheritance,Php,Oop,Inheritance,我正在尝试做一些我认为非常简单的事情,但由于我对PHP中的OOP比较陌生,所以我遇到了一些麻烦 这是我的密码: <?php class MyClass { protected $variable = 'DEFAULT'; function __construct($newVariable) { $this->variable = $newVariable; echo $this->variable; } } cl

我正在尝试做一些我认为非常简单的事情,但由于我对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类从主类继承环境参数,其状态为


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

MyClass的构造函数在
OtherClass
中被重写。父构造函数不会隐式自动运行。如果还想运行父构造函数,请在
OtherClass::\u-construct
中调用
parent::\u-construct()


当然,这里会有一个问题,因为
MyClass::\u-construct
需要一个参数,而
OtherClass::\u-construct
没有参数。这样说,您希望值如何更改…?

您没有重新定义变量,您只是在父构造函数中设置它。调用它,您就得到了所需的内容(请参阅代码中的注释,仅一行):



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

您需要在子类中添加对
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();
}

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

您必须执行
$bar=newotherclass(“修改”)
然后,将父::u构造($newVariable)添加到第二个u构造中。(以及相应的参数)


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

您想要做的是不可能的,因为:$foo和$bar是类的实例,所以它们之间没有链接


使用构造类比,您的两个类类似于建筑平面图:房屋平面图和带车库的房屋平面图。你要做的就是建造一座房子(比如一个类),在里面放上一张床(设置一些变量),当你建造另一座有车库的房子时,你想在里面放上同样的床。这不会发生。

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


您也可以在子类中传入
'MODIFIED'
arg,然后用construct初始化它。因为foobar是两个不同的实例(属于同一类),但它们没有链接在一起。

您没有重新定义变量,只是在父构造函数中设置它。这里的OOP只是函数及其默认变量的继承。它不是把两个物体神奇地连接在一起。遗憾的是,问题是,这里我感兴趣的是‘修改’值。如果我再次调用父::构造,我将需要指定$newVariable。因此,无论我放什么,它都不会是第一次传递给MyClass的值。总的来说,我有一大堆变量需要传递给子类,这些变量有时会被MyClass的内部函数修改,但我开始怀疑这是否真的可能。@Maxime:这只是继承。受保护的成员可由父级和子级访问,但它始终是同一个变量,因此无论子级或父级代码是否更改它,两者访问的变量始终相同。你必须告诉我你真正想要实现的目标,因为我无法从你的问题中看到你的评论。有很多方法可以处理继承问题,所以最好说出您希望实现的目标。在这里,我在主要帖子中添加了上下文,但所有这些答案都指出,我可能只是对我想做的事情采取了错误的方法。
function doSomethingAWESOME()
{
    echo "NEVER!!!";
}

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