За последние 24 часа нас посетили 16634 программиста и 1687 роботов. Сейчас ищут 1110 программистов ...

Наследование классов переопределение переменных

Тема в разделе "PHP для новичков", создана пользователем Angelir, 4 июл 2020.

  1. Angelir

    Angelir Новичок

    С нами с:
    4 июл 2020
    Сообщения:
    3
    Симпатии:
    0
    Здравствуйте, есть два класса Родитель-printTableHeader и Потомок -printTableBody
    при создании потомка в конструктор передаются объекты DataTime и getData:
    dd=new printTableBody(DataTime $d1,DataTime $d2, getData);
    ниже представлен код двух классов:

    Код (Text):
    1. class printTableHeader {
    2.  
    3.     public function __construct($d1, $d2)
    4.     {
    5.         echo "<div>";
    6.         echo "<table id='tb_position'>";
    7.         echo"<tr><th id='th_PlusMinus'>+/-</th><th id='id_obj'>ID объекта</th><th id='id_canal'>ID канала</th><th id='name_obj'>Наименование ГРС/ГИС/выход (ГРС/ГИС)</th>";
    8.  
    9.         while($d1<$d2) {
    10.             echo "<th id='th_width'>Qcут. м3 " . $d1->format('d-m-Y') . "</th>";
    11.             $d1->modify('+1 days');
    12.         }
    13.  
    14.         echo "</tr>";
    15.         echo "</table>";
    16.         echo "</div>";
    17.     }
    18. }
    19.  
    20. class printTableBody extends printTableHeader {
    21.     private $d_1, $d2;
    22.     public function __construct(object $d1,object $d2,get_Data $getData){
    23.         $this->d_1=$d1; $this->d2=$d2;
    24.         parent::__construct($d1,$d2);
    25.         echo $this->d_1->format('Y-m-d')."----".$d2->format('Y-m-d')."<br>";
    26. }
    вопрос - почему свойство класса printTableBody::d_1 переопределяется при вызове конструктора parent::__construct($d1,$d2) класса printTableHeader
    т.е. например при таком определении:
    Код (Text):
    1.  
    2. $d1=new DateTime('2020-01-01");
    3. $d2=new DateTime('2020-01-04');
    4. dd=new printTableBody(DataTime $d1,DataTime $d2, getData);
    свойство класса printTableBody::d_1 принимает значение 2020-01-04
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    public тут не нужен
    https://www.php.net/manual/ru/language.oop5.decon.php

    В следующий раз, лучше давать код который смогут запустить сразу.

    Похоже тут создается ссылка на объект, а не создание новой копии, например через clone (https://www.php.net/manual/ru/language.oop5.cloning.php)

    Ещё есть https://www.php.net/manual/ru/class.datetimeimmutable.php на замену datetime
     
    Angelir нравится это.
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    Как-то классы вообще не понять для чего использованы. Конструктор, который вместо того, чтобы инициализировать объект, что-то печатает - нехорошо. Чем так пользоваться классами, сделайте на функциях. Либо прочитайте, что такое классы и нафига они нужны. Для PHP есть шикарная книжка "PHP: объекты, шаблоны и методики программирования" Занстры.

    Название класса не должно быть глаголом, сразу ошибка. Тут должен был быть класс Table, если уж так хотите инкапсулировать вывод таблицы, у него методы printHeader, printBody, как пример.

    Строго говоря, вообще нигде не нужен, но не помешает... Обычно пишется всё-таки.
     
    #3 mkramer, 5 июл 2020
    Последнее редактирование: 5 июл 2020
    Angelir нравится это.
  4. Angelir

    Angelir Новичок

    С нами с:
    4 июл 2020
    Сообщения:
    3
    Симпатии:
    0
    Всем добрый день!

    Спасибо за подсказку, сегодня утром до самого доперло, что действительно создается ссылка, а не копия объекта!

    Спасибо за комментарий! Согласен с Вашим утверждением, честно говоря да действительно я не понимаю для чего нужны классы, к моему великому сожалению. Вы правильно заметили, что все это можно запросто заменить функциями. Вот и у меня сложилось такое впечатление о классах, тогда для чего нужны вообще классы и как все задуманное мною завернуть в классы для "правильного" программирования.
    Нужно при помощи SQL-запросов получить определенный набор данных и засунуть это все в общую таблицу. Таблица не совсем простая, нужно сделать, что бы каждая строка еще могла разворачиваться и отображать дополнительную информацию.
    Я создал каскад классов:

    PHP:
    1. //базовый класс
    2. class DB_config {
    3.     protected $srv_name;
    4.     protected $DB_Name;
    5.     protected $userName;
    6.     protected $password;
    7.     protected $paramSQL=array();
    8.     function __construct($srv_name, $DB_Name, $userName, $password, $paramSQL=array("CharacterSet"=>"UTF-8")) {
    9.         $this->srv_name=$srv_name;
    10.         $this->DB_Name=$DB_Name;
    11.         $this->userName=$userName;
    12.         $this->password=$password;
    13.         $this->paramSQL=$paramSQL;
    14.     }
    15. }
    дальше пошли классы расширения extends от DB_config:
    PHP:
    1. class DB_connect extends DB_config {
    2.     protected $con;
    3.     protected $queryData;
    4.     protected $result;
    5.     public function connect() {
    6.         try {
    7.             $this->con=new PDO('sqlsrv:Server='.$this->srv_name.';Database='.$this->DB_Name,$this->userName,
    8.                 $this->password,$this->paramSQL);
    9.         }
    10.         catch (PDOException $e){
    11.             echo'Ошибка при получении указателя на БД: '.$e->getMessage().'\n';
    12.         }
    13.     }
    14.     public function sql_query($strQuery){
    15.         $this->connect();
    16.         $this->queryData=$this->con->query($strQuery);
    17.         $this->result=$this->queryData->fetchAll(PDO::FETCH_ASSOC);
    18.     }
    19.     public function close(){
    20.         $this->con = null;
    21.     }
    22. }
    23.  
    24. class get_Data extends DB_connect {
    25.     public $structure_obj;
    26.     public $dataDaily;
    27.     public $dataHourly;
    28.     public function get_stucture_obj(){
    29.         $this->sql_query("select * from hlp_GIS_FolderGIS_Izmeritel_IzmPoint where ID_Folder=2");
    30.         $this->structure_obj=$this->result;
    31.  
    32.     }
    33.     public function get_dataDaily($id_Izmerit, $id_IzmerPoint, $dt1, $dt2, $typeData=2){
    34.         $this->sql_query("exec GetStandardData " .$id_Izmerit.", ".$id_IzmerPoint.", $typeData, '".$dt1." 10:00:00', '".$dt2." 10:00:00'");
    35.         $this->dataDaily=$this->result;
    36.  
    37.     }
    38.     public function get_dataHourly($id_Izmerit, $id_IzmerPoint, $dt1, $dt2, $typeData=1){
    39.         $this->sql_query("exec GetStandardData " .$id_Izmerit.", ".$id_IzmerPoint.", $typeData, '".$dt1." 10:00:00', '".$dt2." 10:00:00'");
    40.         $this->dataHourly=$this->result;
    41.     }
    И еще базовый класс printTableHeader и прозводный от него
    printTableHeader последний пока в разработке:

    PHP:
    1. class printTableHeader {
    2.     protected $d1, $d2, $datInterval;
    3.     public function __construct($d1, $d2)
    4.     {
    5.         $this->d1=$d1;
    6.         $this->d2=$d2;
    7.         $this->datInterval=$this->d1->diff($this->d2);
    8.         echo "<div>";
    9.         echo "<table id='tb_position'>";
    10.         echo"<tr><th id='th_PlusMinus'>+/-</th><th id='id_obj'>ID объекта</th><th id='id_canal'>ID канала</th><th id='name_obj'>Наименование ГРС/ГИС/выход (ГРС/ГИС)</th>";
    11.  
    12.         while($this->d1<$this->d2) {
    13.             echo "<th id='th_width'>Qcут. м3 " . $this->d1->format('d-m-Y') . "</th>";
    14.             $this->d1->modify('+1 days');
    15.         }
    16.         echo "</tr>";
    17.         echo "</table>";
    18.         echo "</div>";
    19.     }
    20. }
    21. class printTableBody extends printTableHeader {
    22.     public function __construct($d1,$d2,get_Data $getData){
    23.         parent::__construct($d1,$d2);
    24.         $getData->get_stucture_obj();
    25.         foreach ($getData->structure_obj as $obj){
    26.             $getData->get_dataDaily($obj['ID_Izmerit'],$obj['ID_IzmerPoint'], $this->d1->format('Y-m-d'), $this->d2->format('Y-m-d'));
    27.             if(!empty($getData->dataDaily)){
    28.                 ...
    29.             }
    30.         }
    31.     }
    32. }
    Как бы структурировать это все таким образом чтобы классы были не бессмысленны, и при этом все работало эффективно. Ну и может у меня, в конце концов появится понимание как и зачем нужны классы в ООП?
    Ссылку данную Вами на литературу обязательно прочту!
     
    #4 Angelir, 5 июл 2020
    Последнее редактирование: 5 июл 2020
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    Пока вы базу не поймёте, показывать вам на коде бессмысленно. Основные понятия: абстракция, инкапсуляция, наследование, полиморфизм. Чтоб писать ООП, надо другими категориями мыслить.
     
  6. Angelir

    Angelir Новичок

    С нами с:
    4 июл 2020
    Сообщения:
    3
    Симпатии:
    0
    Выстроить бы структуру необходимых классов, в книгах все вроде просто и понятно пока читаешь, но как начинаешь делать что то свое сразу понимаешь, что ничего не понимаешь!:)