Подтвердить что ты не робот

Доступ к родительскому классу из дочернего

См. следующий пример (PHP)

class Parent
{ 
  protected $_property;
  protected $_anotherP;

  public function __construct($var)
  {
    $this->_property = $var;
    $this->someMethod();  #Sets $_anotherP
  }

  protected function someMethod()
  ...
}

class Child extends Parent
{
  protected $parent;

  public function __construct($parent)
  {
    $this->parent = $parent;
  }

  private function myMethod()
  {
    return $this->parent->_anotherP;  #Note this line
  }
}

Я новичок в ООП и немного незнаю.

Здесь, чтобы получить доступ к свойству parent, я использую экземпляр этого класса, который кажется неправильным: S (тогда не нужно быть потом дочерним). Есть ли простой способ, чтобы я мог синхронизировать родительские свойства с дочерними свойствами и может напрямую обращаться к $this- > anotherP, не используя $this- > parent- > anotherP?

4b9b3361

Ответ 1

Поскольку ваш класс Child расширяет ваш класс Parent, все свойства и методы, которые либо public, либо protected в классе Parent будут видны классом Child, как если бы они были определенном в классе Child, и другим способом arround.

Когда класс Child class extends Parent, его можно увидеть как "Child is Parent" - это означает, что Child имеет свойства Parent, если он не переопределит этот другой способ.

(Кстати, обратите внимание, что "Parent" является зарезервированным ключевым словом в PHP, что означает, что вы не можете назвать класс с таким именем)


Вот краткий пример "родительского" класса:

class MyParent {
    protected $data;
    public function __construct() {
        $this->someMethodInTheParentClass();
    }
    protected function someMethodInTheParentClass() {
        $this->data = 123456;
    }
}

И это "дочерний" класс:

class Child extends MyParent {
    public function __construct() {
        parent::__construct();
    }
    public function getData() {
        return $this->data; // will return the $data property 
                            // that defined in the MyParent class
    }
}

Это можно использовать следующим образом:

$a = new Child();
var_dump($a->getData());

И вы получите результат:

int 123456

Это означает, что свойство $data, определенное в классе MyParent и инициализированное в методе того же класса MyParent, доступно классу Child, как если бы оно было его собственным.


Чтобы сделать вещи простыми: поскольку Child "является" MyParent, ему не нужно указывать указатель на... сам; -)

Ответ 2

Это может сэкономить вам несколько часов на поиск.

Помните: ваш класс Child только наследует свойства DEFINED в классе Parent... Итак, если вы создаете экземпляр объекта с использованием класса Parent, а затем заполняете его данными, тогда эти данные НЕ будут доступны в вашем дочернем классе...

Это, конечно, очевидно, но я предполагаю, что другие могут столкнуться с одной и той же проблемой.

Супер простое решение не расширяет ничего, просто передайте объект $вашего родительского класса в ваш дочерний класс через конструктор. Таким образом, у вас есть доступ ко всем свойствам и методам объекта, сгенерированного родительским классом

Пример

class child {

    public parentObject;

    public function __construct($parentObject) {
        $this->parentObject = $parentObject;
    }

}

Если ваш $parentObject имеет общедоступное имя $name, вы можете получить к нему доступ в дочернем классе с помощью функции, например:

public function print_name() {
    echo $this->parentObject->name;
}

Ответ 3

это должно работать.

class Child extends Parent
{
  private function myMethod()
  {
    return $this->_anotherP;
  }
}

потому что _anotherP защищен, поэтому каждый деривативный класс может присоединиться к нему, но не в другом объекте, его одном и том же объекте.

Однако создайте геттеры сеттерами в родительском объекте - мудрый выбор.