我正在尝试做一些我认为非常简单的事情,但由于我对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参数,处于它们所处的状态。
当我输入它时,我意识到我接近它的方式可能不是正确的方法,因为当我查看我的代码时,我认为可能有另一种方法可以做到这一点。在我的代码中,我有两个对象,我需要它只有一个,但我真的不知道如何实际放置它。
答案 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 是两个不同的实例(属于同一类),但是它们没有链接在一起。