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