У меня есть основной класс и два расширенных класса:
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.