Здравствуйте, есть два класса Родитель-printTableHeader и Потомок -printTableBody при создании потомка в конструктор передаются объекты DataTime и getData: dd=new printTableBody(DataTime $d1,DataTime $d2, getData); ниже представлен код двух классов: Код (Text): class printTableHeader { public function __construct($d1, $d2) { echo "<div>"; echo "<table id='tb_position'>"; echo"<tr><th id='th_PlusMinus'>+/-</th><th id='id_obj'>ID объекта</th><th id='id_canal'>ID канала</th><th id='name_obj'>Наименование ГРС/ГИС/выход (ГРС/ГИС)</th>"; while($d1<$d2) { echo "<th id='th_width'>Qcут. м3 " . $d1->format('d-m-Y') . "</th>"; $d1->modify('+1 days'); } echo "</tr>"; echo "</table>"; echo "</div>"; } } class printTableBody extends printTableHeader { private $d_1, $d2; public function __construct(object $d1,object $d2,get_Data $getData){ $this->d_1=$d1; $this->d2=$d2; parent::__construct($d1,$d2); echo $this->d_1->format('Y-m-d')."----".$d2->format('Y-m-d')."<br>"; } вопрос - почему свойство класса printTableBody::d_1 переопределяется при вызове конструктора parent::__construct($d1,$d2) класса printTableHeader т.е. например при таком определении: Код (Text): $d1=new DateTime('2020-01-01"); $d2=new DateTime('2020-01-04'); dd=new printTableBody(DataTime $d1,DataTime $d2, getData); свойство класса printTableBody::d_1 принимает значение 2020-01-04
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
Как-то классы вообще не понять для чего использованы. Конструктор, который вместо того, чтобы инициализировать объект, что-то печатает - нехорошо. Чем так пользоваться классами, сделайте на функциях. Либо прочитайте, что такое классы и нафига они нужны. Для PHP есть шикарная книжка "PHP: объекты, шаблоны и методики программирования" Занстры. Название класса не должно быть глаголом, сразу ошибка. Тут должен был быть класс Table, если уж так хотите инкапсулировать вывод таблицы, у него методы printHeader, printBody, как пример. Строго говоря, вообще нигде не нужен, но не помешает... Обычно пишется всё-таки.
Всем добрый день! Спасибо за подсказку, сегодня утром до самого доперло, что действительно создается ссылка, а не копия объекта! Спасибо за комментарий! Согласен с Вашим утверждением, честно говоря да действительно я не понимаю для чего нужны классы, к моему великому сожалению. Вы правильно заметили, что все это можно запросто заменить функциями. Вот и у меня сложилось такое впечатление о классах, тогда для чего нужны вообще классы и как все задуманное мною завернуть в классы для "правильного" программирования. Нужно при помощи SQL-запросов получить определенный набор данных и засунуть это все в общую таблицу. Таблица не совсем простая, нужно сделать, что бы каждая строка еще могла разворачиваться и отображать дополнительную информацию. Я создал каскад классов: PHP: //базовый класс class DB_config { protected $srv_name; protected $DB_Name; protected $userName; protected $password; protected $paramSQL=array(); function __construct($srv_name, $DB_Name, $userName, $password, $paramSQL=array("CharacterSet"=>"UTF-8")) { $this->srv_name=$srv_name; $this->DB_Name=$DB_Name; $this->userName=$userName; $this->password=$password; $this->paramSQL=$paramSQL; } } дальше пошли классы расширения extends от DB_config: PHP: class DB_connect extends DB_config { protected $con; protected $queryData; protected $result; public function connect() { try { $this->con=new PDO('sqlsrv:Server='.$this->srv_name.';Database='.$this->DB_Name,$this->userName, $this->password,$this->paramSQL); } catch (PDOException $e){ echo'Ошибка при получении указателя на БД: '.$e->getMessage().'\n'; } } public function sql_query($strQuery){ $this->connect(); $this->queryData=$this->con->query($strQuery); $this->result=$this->queryData->fetchAll(PDO::FETCH_ASSOC); } public function close(){ $this->con = null; } } class get_Data extends DB_connect { public $structure_obj; public $dataDaily; public $dataHourly; public function get_stucture_obj(){ $this->sql_query("select * from hlp_GIS_FolderGIS_Izmeritel_IzmPoint where ID_Folder=2"); $this->structure_obj=$this->result; } public function get_dataDaily($id_Izmerit, $id_IzmerPoint, $dt1, $dt2, $typeData=2){ $this->sql_query("exec GetStandardData " .$id_Izmerit.", ".$id_IzmerPoint.", $typeData, '".$dt1." 10:00:00', '".$dt2." 10:00:00'"); $this->dataDaily=$this->result; } public function get_dataHourly($id_Izmerit, $id_IzmerPoint, $dt1, $dt2, $typeData=1){ $this->sql_query("exec GetStandardData " .$id_Izmerit.", ".$id_IzmerPoint.", $typeData, '".$dt1." 10:00:00', '".$dt2." 10:00:00'"); $this->dataHourly=$this->result; } И еще базовый класс printTableHeader и прозводный от него printTableHeader последний пока в разработке: PHP: class printTableHeader { protected $d1, $d2, $datInterval; public function __construct($d1, $d2) { $this->d1=$d1; $this->d2=$d2; $this->datInterval=$this->d1->diff($this->d2); echo "<div>"; echo "<table id='tb_position'>"; echo"<tr><th id='th_PlusMinus'>+/-</th><th id='id_obj'>ID объекта</th><th id='id_canal'>ID канала</th><th id='name_obj'>Наименование ГРС/ГИС/выход (ГРС/ГИС)</th>"; while($this->d1<$this->d2) { echo "<th id='th_width'>Qcут. м3 " . $this->d1->format('d-m-Y') . "</th>"; $this->d1->modify('+1 days'); } echo "</tr>"; echo "</table>"; echo "</div>"; } } class printTableBody extends printTableHeader { public function __construct($d1,$d2,get_Data $getData){ parent::__construct($d1,$d2); $getData->get_stucture_obj(); foreach ($getData->structure_obj as $obj){ $getData->get_dataDaily($obj['ID_Izmerit'],$obj['ID_IzmerPoint'], $this->d1->format('Y-m-d'), $this->d2->format('Y-m-d')); if(!empty($getData->dataDaily)){ ... } } } } Как бы структурировать это все таким образом чтобы классы были не бессмысленны, и при этом все работало эффективно. Ну и может у меня, в конце концов появится понимание как и зачем нужны классы в ООП? Ссылку данную Вами на литературу обязательно прочту!
Пока вы базу не поймёте, показывать вам на коде бессмысленно. Основные понятия: абстракция, инкапсуляция, наследование, полиморфизм. Чтоб писать ООП, надо другими категориями мыслить.
Выстроить бы структуру необходимых классов, в книгах все вроде просто и понятно пока читаешь, но как начинаешь делать что то свое сразу понимаешь, что ничего не понимаешь!