Twoje podejście obiektowe jak na początek jest w większości poprawne. Stworzyłeś abstrakcyjną klasę bazową modul, która posiada właściwości i metodę konstruktora, a następnie dziedziczą po niej klasy modul1, modul2 i modul3. Każda z tych klas ma swoją metodę gethtml() do generowania kodu html. Ogólnie rzecz biorąc, jest to dobry krok w kierunku tworzenia bardziej zorganizowanego kodu.
czytałem że kiepski programista daje dużo ifów
To prawda, że nadmiar instrukcji warunkowych może sprawić, że kod staje się trudny do zarządzania i rozbudowy. Tworzenie hierarchii klas, jak to zrobiłeś, jest krokiem w dobrą stronę.
Zwróć uwagę na konwencje nazewnicze w PHP. Nazwy klas powinny zaczynać się od wielkiej litery, a metody i zmienne od małej litery.
Możesz również wprowadzić drobne usprawnienia w klasach modułów, takie jak przeniesienie powtarzającego się kodu do klasy bazowej, unikając duplikacji kodu.
Propozycja zmian w Twoim kodzie:
<?php
////////////////////// MODEL //////////////////////////
abstract class BodyModul {
public $containerClass;
public $contentClass;
public $content;
function __construct($containerClass, $contentClass, $content) {
$this->containerClass = $containerClass;
$this->contentClass = $contentClass;
$this->content = $content;
}
protected function generateHtml($innerHtml, $parentTag='div', $innerTag='div') {
return '<' . $parentTag . ' class="' . $this->containerClass . '">
<' . $innerTag . ' class="' . $this->contentClass . '">' . $innerHtml . '</' . $innerTag . '>
</'.$parentTag.'>';
}
abstract function getHtml();
}
//////////////////////// LOGIC ///////////////////////////
class HeaderModule extends BodyModul {
function getHtml() {
if (is_array($this->content)) {
$menu = array_map(function($item) {
return '<li><a href="'.$item['href'].'">'.$item['text'].'</a></li>';
}, $this->content);
return $this->generateHtml('<ul>'.implode('', $menu).'</ul>', 'header', 'nav');
} else {
return $this->generateHtml($this->content, 'header');
}
}
}
class MainModule extends BodyModul {
function getHtml() {
return $this->generateHtml($this->content, 'main');
}
}
class FooterModule extends BodyModul {
function getHtml() {
return $this->generateHtml($this->content, 'footer');
}
}
//////////////////////// LAYOUT /////////////////////////////
$menu = [
[
"text" => "Google",
"href" => "https://www.google.com"
],
[
"text" => "Facebook",
"href" => "https://www.facebook.com"
],
[
"text" => "Twitter",
"href" => "https://www.twitter.com"
],
[
"text" => "GitHub",
"href" => "https://www.github.com"
],
[
"text" => "LinkedIn",
"href" => "https://www.linkedin.com"
]
];
$header = new HeaderModule('container', 'horizontal', $menu);
echo $header->getHtml();
$text = 'Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor';
$main = new MainModule('container', 'content', $text);
echo $main->getHtml();
$text = 'STOPKA';
$footer = new FooterModule('container', null, $text);
echo $footer->getHtml();
?>
<!-- dla prezentacji -->
<style>
* {
margin: 0;
padding: 0;
}
html, body {
padding: .5rem;
}
.container {
max-width: 1000px;
margin: .5rem auto;
background-color: green;
}
header, main, footer {
width: 100%;
}
header nav ul {
display: flex;
gap: .5rem;
list-style-type: none;
}
header nav ul a {
display: block;
text-decoration: none;
padding: .5rem;
color: white;
}
header nav.horizontal ul {
flex-direction: row;
}
header nav.vertical ul {
flex-direction: column;
}
main .content {
display: flex;
justify-content: center;
align-items: center;
min-height: 50dvh;
}
footer {
display: flex;
justify-content: end;
}
footer div {
padding: 1rem;
}
</style>
przykładowy wygenerowany kod html
<header class="container">
<nav class="horizontal">
<ul>
<li>
<a href="https://www.google.com">Google</a>
</li>
<li>
<a href="https://www.facebook.com">Facebook</a>
</li>
<li>
<a href="https://www.twitter.com">Twitter</a>
</li>
<li>
<a href="https://www.github.com">GitHub</a>
</li>
<li>
<a href="https://www.linkedin.com">LinkedIn</a>
</li>
</ul>
</nav>
</header>
<main class="container">
<div class="content">
Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor
</div>
</main>
<footer class="container">
<div class>STOPKA</div>
</footer>