php class extends, переменная из другого расширенного класса

У меня есть основной класс и два расширенных класса:

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 ()) остается пустым. Мне явно не хватает чего-то простого здесь … Кроме того, есть ли способ пойти на разделение длинных классов в соответствующих подклассах?

Пример использования Injection Dependency (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(); 

Чтобы прояснить ситуацию, это может помочь подумать об этом таким образом. Предположим, что ваш « Main – это класс, который обозначает автомобиль (и, следовательно, мы переименовываем его в « Vehicle ), поэтому класс означает, что « Vehicle определяет характеристики тележки, но не для того, чтобы выполнять операции (нам нужен экземпляр для этого). Давайте переведем также ваш класс A в Car и B в Truck : поэтому они специализируются на вашем основном классе, который наряду с областью каждой характеристики универсального Vehicle расширяет концепцию «транспортного средства» и указывает на конкретные поведения и свойства автомобилей в вообще , и Trucks в целом , но – и в этом суть – не ссылайтесь на конкретный автомобиль или грузовик. Для этого нужны примеры .

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

С этого момента мы можем определить конкретные экземпляры (ваши Porsche, мои Camaro … разные автомобили), на которых мы можем выполнять операции (вызовы) и задавать свойства.

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

Но каждый случай остается независимым от другого.

изменение:

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

чтобы:

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

Обратите внимание на это ключевое слово $ this

Оба являются разными экземплярами одного и того же класса.

Операции, выполняемые в одном экземпляре, не применяются ни к одному из других (это как бы точка ООП).

Чтобы сделать то, что вы хотите, вы можете расширить B, а затем выполнить обе операции в одном экземпляре класса B.