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

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

Мне нужен родительский класс для доступа к его дочерним свойствам:

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.

Я не нашел ничего похожего на "набор функций", который будет просто скопирован в дочернем классе...

4b9b3361

Ответ 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