Наследование PHP не передает значения

#php

Вопрос:

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

 class mother
{
    public function __construct($db=""){
        $this -> db = $db; 
    }
     
    public function setValue($name,$value){
        $this -> $name = $value;
    }

    public function getValue($name){
        return $this -> $name;
    }
}

class son extends mother
{
    
    function __construct(){
        
    }

    public function show_name(){
        return $this->name;
    }
}

$a = new mother($db);
$a->setValue("name", 'Usman');

$b = new son();
$name = $b->show_name();
 

Родительский класс (мать) будет иметь значения, установленные с помощью функции setValue, должен ли я не иметь возможности получить доступ к этим значениям из класса son?

Комментарии:

1. Я думаю, вам нужно $b->setValue(«имя»,»значение»);

Ответ №1:

$a это просто объект класса Мать, $b просто объект класса Сын. Автоматическая связь между значениями свойств этих 2 объектов отсутствует.

Если вы хотите использовать $b класс the Son, вам сначала нужно будет загрузить в него данные

Поэтому, когда вы создаете объект Son, вы также получаете функциональность Mother, т. Е. Методы и свойства, но не значения, которые вы поместили в Mother перед созданием Son. Они отделены друг от друга.

 class mother
{
    public $name;
    public function __construct($db=""){
        $this -> db = $db; 
    }
     
    public function setValue($name,$value){
        $this->{$name} = $value;
    }

    public function getValue($name){
        return $this -> $name;
    }
}

class son extends mother
{
    

}

$db = 1;   # just to make it work
$a = new mother($db);
$a->setValue("name", 'Usman');

$b = new son();
# note calling the Mother method from the Son class
$b->setValue("name", 'Riggs');

#note, calling methods that only exists in Mother
echo $a->getValue('name');
echo PHP_EOL;
echo $b->getValue('name');
 

Результат

 Usman
Riggs
 

Комментарии:

1. Спасибо @RiggsFolly, я предполагал, что ценности также передаются по наследству.

Ответ №2:

Вы создали два отдельных объекта $a и $b . Если вы установите что-то в объекте $a , это не будет видно одновременно $b . Вы должны выполнить настройку значения в $b объекте, в котором его нет $a .

Другое дело-правильная конструкция son объекта, несмотря на наследование от mother класса, вы не задаете $db в нем значение. Измените свой son класс , чтобы принять это значение в конструкторе и передать его конструктору mother класса, или удалите пустой конструктор son класса и используйте его из mother класса.

 class son extends mother
{   
    public function show_name()
    {
        // You are building a lot of dynamic fields, 
        //so if you use a table, you can check a collection of their names.
        //I explain the use of the table below in the mother class code. 
        return array_keys($this->fields); 
    }
}

$b = new son($db); //here you are using a mother constructor
$b->setValue("name", 'Usman');
$b->setValue("name1", 'Usman1');
$b->setValue("name2", 'Usman2');
$name = $b->show_name(); //$name is an array of names here
 

Также рекомендуется явно объявлять поля в классах, а не создавать все с открытым доступом (как $db в примере ниже). Что касается динамических полей, то, на мой взгляд, было бы также гораздо лучше построить их в виде таблицы.

 class mother
{
    protected $db;
    protected $fields;

    public function __construct($db="")
    {
        $this->db = $db; 
        $this->fields = [];
    }
 
    public function setValue($name, $value)
    {
        $this->fields[$name] = $value;
    }

    public function getValue($name)
    {
       return $this->fields[$name] ?? null; //if the value of name does not exist, we will return anything, e.g. null
    }
}
 

Если вы выполните код с var_dump($name); помощью, вы увидите

массив(3) { [0]=> строка(4) «имя» [1]=>> строка(5) «имя 1» [2]=>>> строка(5) «имя 2» }