HTML ichida PHP — alternativ sintaksis, include va require
Muammodan boshlaylik
Saytingizda 10 ta sahifa bor. Har birida bir xil menyu (header) va bir xil footer. Menyuga yangi "Aloqa" bandini qo'shish kerak bo'ldi — 10 ta faylni ochib, 10 marta bir xil o'zgarishni qilasiz. Bitta faylni unutsangiz — o'sha sahifada eski menyu qoladi.
PHP bu muammoni ikki yo'l bilan hal qiladi:
- HTML ni qismlarga bo'lib, kerakli joyda ulash (
include,require) - HTML ichiga PHP ni o'qishli yozish (alternativ sintaksis)
include va require
Umumiy qismni alohida faylga chiqaramiz:
loyiha/
├── index.php
├── aloqa.php
└── qismlar/
├── header.php
└── footer.php
qismlar/header.php:
<!DOCTYPE html>
<html lang="uz">
<head>
<meta charset="UTF-8">
<title><?= $sarlavha ?? 'Mening saytim' ?></title>
</head>
<body>
<nav>
<a href="/">Bosh sahifa</a>
<a href="/aloqa.php">Aloqa</a>
</nav>
<main>
qismlar/footer.php:
</main>
<footer>© <?= date('Y') ?> Mening saytim</footer>
</body>
</html>
index.php:
<?php
$sarlavha = "Bosh sahifa";
require __DIR__ . '/qismlar/header.php';
?>
<h1>Xush kelibsiz!</h1>
<p>Bu bosh sahifa.</p>
<?php require __DIR__ . '/qismlar/footer.php'; ?>
require — "shu faylning mazmunini aynan shu joyga qo'y va bajar" degani. Ulangan fayl chaqirgan joydagi o'zgaruvchilarni ko'radi — shuning uchun header $sarlavha ni ishlata oladi.
Endi menyuni o'zgartirish uchun faqat header.php ni tahrirlaysiz.
To'rt xil variant
| Funksiya | Fayl topilmasa | Ikki marta ulansa |
|---|---|---|
include |
Warning, dastur davom etadi | Qayta ulaydi |
require |
Fatal error, dastur to'xtaydi | Qayta ulaydi |
include_once |
Warning | Ikkinchi marta e'tiborsiz |
require_once |
Fatal error | Ikkinchi marta e'tiborsiz |
Qachon qaysi biri:
- Funksiyalar, classlar, sozlamalar fayli →
require_once. Busiz bo'lmaydi va ikki marta ulansa "Cannot redeclare function" xatosi chiqadi. - HTML qismlar (header, footer, karta) →
require. Ular bir sahifada bir necha marta ulanishi mumkin. include— kamdan-kam: fayl bo'lmasa ham sahifa ishlashi kerak bo'lganda.
Nima uchun __DIR__?
require 'qismlar/header.php'; // ❌ xavfli
require __DIR__ . '/qismlar/header.php'; // ✅
Nisbiy yo'l ('qismlar/header.php') joriy ishchi papkaga nisbatan qidiriladi — bu esa skript qayerdan ishga tushirilganiga bog'liq. admin/index.php dan ulasangiz, PHP admin/qismlar/header.php ni qidiradi va topmaydi.
__DIR__ — "shu fayl turgan papka". U har doim bir xil, shuning uchun yo'l har doim to'g'ri.
Ulangan fayl qiymat qaytara oladi
Sozlamalar uchun juda qulay usul:
config.php:
<?php
return [
'db_host' => 'localhost',
'db_name' => 'dokon',
'debug' => true,
];
index.php:
<?php
$config = require __DIR__ . '/config.php';
echo $config['db_name']; // dokon
Laravel ning config/ papkasidagi barcha fayllar aynan shunday yozilgan.
Alternativ sintaksis
HTML orasida { va } ni kuzatish juda qiyin:
<?php if ($mahsulotlar) { ?>
<ul>
<?php foreach ($mahsulotlar as $m) { ?>
<li><?= $m['nom'] ?></li>
<?php } ?>
</ul>
<?php } else { ?>
<p>Mahsulot yo'q</p>
<?php } ?>
Qaysi } qaysi blokni yopyapti? Alternativ sintaksis bilan:
<?php if ($mahsulotlar): ?>
<ul>
<?php foreach ($mahsulotlar as $m): ?>
<li><?= htmlspecialchars($m['nom']) ?></li>
<?php endforeach; ?>
</ul>
<?php else: ?>
<p>Mahsulot yo'q</p>
<?php endif; ?>
endforeach, endif — qaysi blok yopilayotgani so'z bilan yozilgan.
| Oddiy | Alternativ |
|---|---|
if (...) { ... } |
if (...): ... endif; |
} elseif (...) { |
elseif (...): |
} else { |
else: |
foreach (...) { ... } |
foreach (...): ... endforeach; |
for (...) { ... } |
for (...): ... endfor; |
while (...) { ... } |
while (...): ... endwhile; |
Qoida: sof PHP faylda — {}, HTML shablonda — alternativ sintaksis.
Mantiq va ko'rinishni ajratish
Yangi boshlovchilar ko'pincha hammasini bitta faylda aralashtirib yozadi: bazaga so'rov, hisob-kitob, HTML. Fayl 500 qatorga yetadi va uni o'qib bo'lmaydi.
Yaxshiroq usul — faylning tepasida mantiq, pastida ko'rinish:
<?php
// ===== MANTIQ =====
$mahsulotlar = [
['nom' => 'Telefon', 'narx' => 3200000],
['nom' => 'Quloqchin', 'narx' => 249000],
];
$jami = array_sum(array_column($mahsulotlar, 'narx'));
$sarlavha = "Katalog";
// ===== KO'RINISH =====
require __DIR__ . '/qismlar/header.php';
?>
<h1>Katalog</h1>
<ul>
<?php foreach ($mahsulotlar as $m): ?>
<li><?= htmlspecialchars($m['nom']) ?> — <?= number_format($m['narx'], 0, '', ' ') ?> so'm</li>
<?php endforeach; ?>
</ul>
<p>Jami: <?= number_format($jami, 0, '', ' ') ?> so'm</p>
<?php require __DIR__ . '/qismlar/footer.php'; ?>
HTML qismida faqat chiqarish va oddiy if/foreach bor. Hisob-kitob — yuqorida. Bu g'oya keyinchalik MVC arxitekturasiga aylanadi (41-dars).
Nima uchun shunday?
Nima uchun PHP faylning ichiga HTML yozish mumkin, boshqa tillarda esa alohida shablon tizimi kerak?
PHP dastlab aynan shu maqsadda — HTML sahifaga kichik dinamik qismlar qo'shish uchun yaratilgan. PHP ning o'zi shablon tili sifatida tug'ilgan, keyin to'liq dasturlash tiliga aylangan. Shuning uchun <?php ?> teglar orasidan tashqaridagi hamma narsa shunchaki chiqariladi. Katta loyihalarda esa baribir alohida shablon tizimlari (Laravel Blade, Twig) ishlatiladi — ular xavfsizroq va qulayroq, lekin ichida xuddi shu g'oya.
Tez-tez uchraydigan xatolar
Nisbiy yo'l bilan ulash:
Warning: require(qismlar/header.php): Failed to open stream: No such file or directory
Yechim — __DIR__ . '/...'.
Funksiyalar faylini require bilan ikki marta ulash:
Fatal error: Cannot redeclare narxFormat() (previously declared in ...)
Yechim — require_once.
Alternativ sintaksisda ; va : ni adashtirish:
<?php if ($x); ?> <!-- ❌ ; — bu bo'sh if, keyingi HTML har doim chiqadi -->
<?php if ($x): ?> <!-- ✅ -->
Xulosa
Eslab qoling:
require— faylni ulaydi; topilmasa dastur to'xtaydirequire_once— funksiya/class fayllari uchun, ikki marta ulanmaydi- Yo'l doim
__DIR__ . '/...'bilan - Ulangan fayl
returnbilan qiymat qaytara oladi — sozlamalar uchun qulay - HTML ichida:
if (...):/endif;,foreach (...):/endforeach; - Tepada mantiq, pastda ko'rinish
Keyingi dars
19-dars: Formalar — $_GET, $_POST, $_SERVER