Yegoroot
12/6/2017 - 2:44 AM

PHP__Полиморфизм подтипов


<?php 
 // file publication.php 
require_once 'data.php';
foreach ($publication as $item) {
  print_r ($item->printItem());
}


 // файл data.php get all data - > array {news} 
require_once 'class.php';
$publication = array();
// подключение к BD
$con = mysqli_connect("localhost", "root", "****", "temp_php");
mysqli_set_charset($con, "utf8");
if (mysqli_connect_error()) {
  echo "Failed is connect to MySQL ".mysqli_connect_error();
}
// получение данных 
$query = 'SELECT * FROM sql_news;';
$result = mysqli_query($con, $query);
while($row = mysqli_fetch_array($result)) {
  $publication[] = new $row['category_id']($row);   // new $row['category_id']($row); - эта конструкция - new ClassName($dataToConstructor)
}

 // file class.php
abstract class SQL_news {
  // создали класс соттветсвующий названию sql таблицы,
  // соответсвенно свойства класса соответсвуют полям в таблице
  // класс абстрактный - то есть он не предполагает создания объектов для этого класса
  public $id;
  public $h1;
  public $short_content;
  public $content;
  public $category_id;
  public $author_id;
  public $date;
  public $preview;
  public $status;
  function __construct($row){
    $this->id = $row['id'];
    $this->h1 = $row['h1'];
    $this->date = $row['date'];
    $this->short_content = $row['short_content'];
    $this->content = $row['content'];
    $this->preview = $row['preview'];
    $this->author_id = $row['author_id'];
    $this->category_id = $row['category_id'];
  }

}
class NewsPublication extends SQL_news {
  public function printItem(){
    // echo '<br>Вызван метод '.__METHOD__;
    echo "<br><strong>Новость Общества</strong>";
    echo "<h1>".$this->h1."</h1>";
    echo $this->date;
    echo "<p>".$this->content."</p>";
    echo '<hr>';
  }
}
class ArticlePublication extends SQL_news {
  public function printItem(){
    // echo '<br>Вызван метод '.__METHOD__;
    echo "<br><strong>Новость Культуры</strong>";
    echo "<h1>".$this->h1."</h1>";
    echo "<p>".$this->short_content."</p>";
    echo '<hr>';
  }
}
class PhotoReportPublication extends SQL_news {
  // фотография и заголовок
  public function printItem(){
    // echo '<br>Вызван метод '.__METHOD__;
    echo "<br><strong>Фотоотчет</strong>";
    echo "<h1>".$this->h1."</h1>";
    echo '<img style="max-width:100%" src="'.$this->preview.'" >';
    echo '<hr>';
  }
}
?>