php类扩展,来自其他扩展类的变量

时间:2012-06-16 09:48:35

标签: php class

我有一个主类和两个扩展类:

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())保持为空。我显然在这里遗漏了一些简单的东西......除此之外,这是在相关子类中拆分长类的方法吗?

4 个答案:

答案 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类的单个实例执行两个操作。

相关问题