HTML ichida PHP — alternativ sintaksis, include va require

~15 daq · PHP · PHP va Veb

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:

  1. HTML ni qismlarga bo'lib, kerakli joyda ulash (include, require)
  2. 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>&copy; <?= 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'xtaydi
  • require_once — funksiya/class fayllari uchun, ikki marta ulanmaydi
  • Yo'l doim __DIR__ . '/...' bilan
  • Ulangan fayl return bilan 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