1

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

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

4 回答 4

4

改变:

class A extends Main {
    public function setVar()
    {
     $foo = "test"; 
    }
}

至:

class A extends Main {
    public function setVar()
    {
     $this->foo = "test"; 
    }
}

注意$this关键字

于 2012-06-16T10:31:35.537 回答
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();
于 2012-06-16T10:26:00.830 回答
2

为了进一步澄清事情,以这种方式思考可能会有所帮助。假设您Main是代表车辆的类(因此我们将其重命名Vehicle),因此意味着Vehicle定义车辆的特征,而不是用于操作的特定特征(我们需要一个实例)。让我们也翻译你的类 A inCar和 B in Truck:因此它们是你的主类的专业化,除了拥有泛型的所有特征外Vehicle,还扩展了“车辆”的概念并指出了 Cars 的一般行为和属性,并且一般的卡车,但是——这就是重点——不要参考特定的汽车或卡车。我们需要实例

class Vehicle
{
   public $numberOfTires;
}

class Car extends Vehicle
{
    function smashMe()
    {
        echo "Oops!";
    }
}

class Truck extends Vehicle
{
    function smashMe()
    {
        echo "More Oops!";
    }
}

从这一点开始,我们可以定义特定的实例(您的保时捷、我的 Camaro……不同的汽车),我们可以在这些实例上执行操作(调用方法)并设置属性。

$genericVehicle = new Vehicle;
$myPorsche = new Car;
$yourCamaro = new Car;
$hisTruck = new Truck;
$herTruck = new Truck;

但是每个实例都保持独立于另一个。

于 2012-06-16T10:28:56.667 回答
1

两者都是同一类的不同实例。

在一个实例上完成的操作不适用于任何其他实例(这有点像 OOP)。

为了做你想做的事,你可以让 B 扩展 A,然后在 B 类的单个实例上执行这两个操作。

于 2012-06-16T09:57:26.257 回答