У меня есть структура классов ниже. Мне было интересно, как я могу получить доступ $varA
из класса C
, И если я изменю значение в классе A
это также видно в классе C
? Или когда я звоню в класс C
все значения в этот момент переданы вновь созданному классу?
class A {
protected $varA;
protected function functionA() {
echo 'hello';
}
}
class B extends A {
protected $varB;
protected function functionB() {
echo 'world';
}
}
class C extends B {
protected $varC;
protected function functionC() {
echo 'Class C';
}
}
Судя по вашим вопросам, это звучит как вы может быть недопонимание различий между классами и объектами. Думайте о классе как о спецификации, из которой создаются объекты. На самом деле вы не собираетесь манипулировать классами в своем коде, вы будете создавать объекты из этих классов и работать с ними. экземпляры классов. Классы, подобные тем, которые вы показали, на самом деле ничего не значат, пока их не создадут.
Когда вы создаете экземпляр класса C
с $c = new C;
Полученный объект $c
будет иметь доступ ко всем открытым и защищенным свойствам любых классов, от которых он наследует; в этом случае A
а также B
, Эти свойства доступны в любом месте C
учебный класс. Вы можете получить к ним доступ с $this->varA
, например.
Но, как вы пишете, ни у одного из классов нет открытых свойств или методов. Таким образом, любой код, который вы пишете, который использует их, не будет иметь доступа к любой свойств. protected
означает, что свойство или метод будут доступны только внутри класса или классов, которые наследуются от него. Так после $c = new C;
Вы не сможете позвонить $c->functionC()
и вы не сможете ссылаться на $->varA
, или даже $c->varC
,
Если вы создаете экземпляр A
и экземпляр C
эти два объекта полностью независимы друг от друга. Пример C
имеет свой $varA
и если вы измените $varA
в случае A
, это не повлияет на случай C
,
Вот пара примеров классов с открытыми методами, чтобы продемонстрировать это.
class A {
protected $varA = 'a';
public function changeA ($newValue) {
$this->varA = $newValue;
}
}
class B extends A {
public function example()
{
echo $this->varA;
}
}
Если вы создаете новый B, его example
метод покажет унаследованное значение в $varA
,
$instanceOfB = new B;
$instanceOfB->example(); // outputs a
Затем, если вы создаете новый A
и изменить значение его $varA
…
$instanceOfA = new A;
$instanceOfA->changeA('something else'); // varA in this object is modified
Значение $varA
в случае B
не влияет.
$instanceOfB->example(); // still outputs a
Я просто использовал один уровень наследования в примере, но концепция та же, что и в настройке A / B / C, которую вы показали.
http://php.net/manual/en/language.oop5.visibility.php
class C extends B {
protected $varC;
protected function functionC() {
$this -> $varA
}
}