2012-06-16 1 views
1

У меня есть основной класс и два расширенных классов:класс PHP распространяется, переменная из другого расширенного класса

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

+6

$ A и $ B отличаются __instances__ ваших классов. Каждый из них полностью независим от другого ... любое изменение в $ A влияет только на $ A, а не на $ B. И $ foo = "test"; только устанавливает локальную varaible, называемую $ foo в методе setVar() для A, а не для класса varaible $ foo .... для этого вам понадобится $ this-> foo = "test"; –

+0

^^ Это ваш ответ прямо там –

+0

* (связанный) * [Изучение классов PHP] (http: // stackoverflow.com/questions/2206387/learning-php-class/2206835 # 2206835) – Gordon

ответ

1

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

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

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

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

2

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

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; 

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

2

изменение:

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

к:

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

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

Смежные вопросы