我有一个主类和两个扩展类:
class Main {
public $foo;
}
class A extends Main {
public function setVar()
{
$foo = "test";
}
}
class B extends Main {
public function getVar()
{
return $this->foo;
}
}
$A = new A;
$B = new B;
$A->setVar();
echo "result: ".$B->getVar();
但结果($ B-> getVar())保持为空。我显然在这里遗漏了一些简单的东西......除此之外,这是在相关子类中拆分长类的方法吗?
答案 0 :(得分:3)
变化:
class A extends Main {
public function setVar()
{
$foo = "test";
}
}
为:
class A extends Main {
public function setVar()
{
$this->foo = "test";
}
}
请注意 $ this 关键字
答案 1 :(得分:2)
使用依赖注入(DI)在不同类实例之间共享Main实例而不是尝试使用继承的示例
class Main {
public $foo;
}
class A {
protected $main;
public function setVar($data)
{
$this->main->foo = $data;
}
public function __construct(Main $main)
{
$this->main = $main;
}
}
class B extends Main {
protected $main;
public function getVar()
{
return $this->main->foo;
}
public function __construct(Main $main)
{
$this->main = $main;
}
}
$M = new Main;
$A = new A($M);
$B = new B($M);
$A->setVar("test");
echo "result: ".$B->getVar();
答案 2 :(得分:2)
为了进一步澄清事情,以这种方式思考它可能会有所帮助。假设您的Main
是一个代表车辆的类(因此我们将其重命名为Vehicle
),因此 class 意味着Vehicle
定义了一个特征veicle但不是特定的操作(我们需要一个实例)。
让我们在Car
中翻译您的A类,在Truck
中翻译B:因此他们是您主要类的特化,同时拥有通用{{1}的所有特征},扩展“车辆”的概念,并指出汽车在一般中的特定行为和属性,以及一般中的卡车,但是 - 这就是重点 - 不要参考特定的汽车或卡车。我们需要实例。
Vehicle
从这一点开始,我们可以定义特定的实例(您的保时捷,我的Camaro ......不同的汽车),我们可以在其上执行操作(调用方法)并设置属性。
class Vehicle
{
public $numberOfTires;
}
class Car extends Vehicle
{
function smashMe()
{
echo "Oops!";
}
}
class Truck extends Vehicle
{
function smashMe()
{
echo "More Oops!";
}
}
但每个实例都保持独立。
答案 3 :(得分:1)
两者都是同一类的不同实例。
在一个实例上完成的操作不适用于任何其他实例(这有点像OOP)。
要做你想做的事,你可以让B扩展A,然后对B类的单个实例执行两个操作。