Доступ к родительскому классу из дочернего
См. следующий пример (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?
Ответы
Ответ 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 защищен, поэтому каждый деривативный класс может присоединиться к нему, но не в другом объекте, его одном и том же объекте.
Однако создайте геттеры сеттерами в родительском объекте - мудрый выбор.