1

メインクラスと2つの拡張クラスがあります。

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ますが、操作を行う特定のクラスではありません(そのためのインスタンスが必要です)。CarクラスAinとBinも翻訳しましょうTruck。したがって、これらはメインクラスの専門分野であり、ジェネリックのすべての特性を備えているだけでなく、「車両」の概念を拡張し、一般的な自動車Vehicleの特定の動作とプロパティを指摘します。トラックは一般的ですが、-そしてそれがポイントです-特定の車またはトラック。そのためのインスタンスが必要です。

class Vehicle
{
   public $numberOfTires;
}

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

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

この時点から、操作(メソッドの呼び出し)を実行してプロパティを設定できる特定のインスタンス(ポルシェ、私のカマロ...さまざまな車)を定義できます。

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

しかし、すべてのインスタンスは他から独立したままです。

于 2012-06-16T10:28:56.667 に答える
1

どちらも同じクラスの異なるインスタンスです。

1つのインスタンスで実行された操作は、他のインスタンスには適用されません(これは、OOPのポイントです)。

必要なことを行うには、BにAを拡張させてから、Bクラスの単一のインスタンスで両方の操作を実行できます。

于 2012-06-16T09:57:26.257 に答える