Доступ к дочернему объекту из родительской области
Мне нужен родительский класс для доступа к его дочерним свойствам:
class Parent {
private $_fields = null;
public function do_something() {
// Access $_fields and $child_var here
}
}
class Child extends Parent {
private $child_var = 'hello';
}
$child = new Child();
$child->do_something();
Когда $_fields
изменен из дочерней области, он все еще null
в родительской области. При попытке получить доступ к $child_var из родительской области с помощью $this->child_var
, конечно, undefined.
Я не нашел ничего похожего на "набор функций", который будет просто скопирован в дочернем классе...
Ответы
Ответ 1
Взгляните на статью о visibility.
В принципе, вы не можете получить доступ к родительским свойствам/методам private
, а родительский доступ к нему невозможен. Однако вы можете объявить свое свойство/метод protected
.
class Parent {
protected $_fields = null;
public function do_something() {
// Access $_fields and $child_var here
}
}
class Child extends Parent {
protected $child_var = 'hello';
}
$child = new Child();
$child->do_something();
Ответ 2
Попытка доступа к дочерним значениям из базового (родительского) класса является плохим дизайном. Что делать, если в будущем кто-то создаст другой класс на основе вашего родительского класса, забудьте создать это конкретное свойство, к которому вы пытаетесь получить доступ в своем родительском классе?
Если вам нужно сделать что-то подобное, вы должны создать свойство в родительском классе, а затем установить его в child:
class Parent
{
protected $child_var;
private $_fields = null;
public function do_something()
{
// Access $_fields and $child_var here
//access it as $this->child_var
}
}
class Child extends Parent
{
$child_var = 'hello';
}
$child = new Child();
$child->do_something();
В основном в родительском объекте вы не должны ссылаться на контент, специфичный для ребенка, потому что вы не можете быть уверены, что он будет там!
Если вам нужно, вы должны использовать абстракцию:
Абстракция PHP