#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» }