Konstantalar — define(), const, sehrli konstantalar
Muammodan boshlaylik
Saytingizda QQS (soliq) stavkasi 12%. Bu raqam 20 ta faylda ishlatiladi. Bir kuni dasturchi tasodifan bitta faylda $qqs = 0.21; deb yozib qo'ydi. Endi bitta sahifada narxlar boshqacha hisoblanadi — va hech kim sababini topa olmaydi.
Ba'zi qiymatlar dastur ishlayotgan paytda hech qachon o'zgarmasligi kerak. Ularni tasodifan o'zgartirib bo'lmaydigan qilish uchun — konstantalar bor.
Konstanta nima?
Konstanta — bir marta qiymat beriladigan va keyin o'zgartirib bo'lmaydigan nom.
O'zgaruvchidan farqlari:
$belgisi yo'q- Odatda KATTA_HARFLAR bilan yoziladi
- Qayta qiymat berib bo'lmaydi
const bilan e'lon qilish
<?php
const QQS_STAVKASI = 0.12;
const SAYT_NOMI = "DevDocs Market";
const MAKS_SAVAT = 50;
echo SAYT_NOMI; // DevDocs Market
echo 100000 * QQS_STAVKASI; // 12000
O'zgartirishga urinsangiz:
<?php
const QQS_STAVKASI = 0.12;
QQS_STAVKASI = 0.21;
// Parse error: syntax error, unexpected token "="
PHP buni umuman ishga tushirmaydi. Xato dastur ishga tushmasdan oldin ko'rinadi — bu juda yaxshi.
define() bilan e'lon qilish
Ikkinchi usul — define() funksiyasi:
<?php
define('VALYUTA', "so'm");
define('DEBUG', true);
echo VALYUTA; // so'm
const va define() farqi
const |
define() |
|
|---|---|---|
| Qachon aniqlanadi | Kod o'qilayotganda (kompilyatsiya) | Kod bajarilayotganda |
if ichida ishlatish |
❌ Mumkin emas | ✅ Mumkin |
| Class ichida | ✅ Mumkin | ❌ Mumkin emas |
| Nomni dinamik yasash | ❌ | ✅ |
<?php
if (true) {
define('REJIM', 'test'); // ✅ ishlaydi
// const REJIM = 'test'; // ❌ Parse error
}
Qoida: odatda const ishlating — o'qish oson va tezroq. define() faqat shart ichida yoki nom dinamik bo'lganda kerak.
Konstanta mavjudligini tekshirish
<?php
if (!defined('DEBUG')) {
define('DEBUG', false);
}
var_dump(DEBUG); // bool(false)
Bu konfiguratsiya fayllarida ko'p uchraydi: "agar kimdir oldin belgilamagan bo'lsa — standart qiymat qo'y".
PHP ning o'rnatilgan konstantalari
PHP sizga tayyor konstantalar beradi:
<?php
echo PHP_VERSION; // 8.3.12 — PHP versiyasi
echo PHP_EOL; // yangi qator (Windows da \r\n, Linux da \n)
echo PHP_INT_MAX; // 9223372036854775807
echo M_PI; // 3.1415926535898
echo PHP_OS_FAMILY; // Windows / Linux / Darwin
PHP_EOL terminalda chiqarishda juda qulay:
<?php
echo "Birinchi qator" . PHP_EOL;
echo "Ikkinchi qator" . PHP_EOL;
Sehrli konstantalar
Ikki tomonida __ (ikkita past chiziq) bo'lgan maxsus konstantalar. Ularning qiymati qayerda yozilganiga qarab o'zgaradi — shuning uchun "sehrli":
<?php
echo __LINE__; // joriy qator raqami
echo __FILE__; // joriy faylning to'liq yo'li: C:\loyiha\index.php
echo __DIR__; // joriy fayl joylashgan papka: C:\loyiha
__DIR__ eng ko'p ishlatiladi — boshqa fayllarni ulashda:
<?php
require __DIR__ . '/config.php';
Bu "shu fayl turgan papkadagi config.php" degani. Qaysi papkadan ishga tushirsangiz ham to'g'ri ishlaydi. Bu haqda include/require darsida batafsil.
Boshqalari: __FUNCTION__, __CLASS__, __METHOD__, __NAMESPACE__ — ularni OOP qismida ko'ramiz.
Nima uchun shunday?
Nima uchun konstantalarda $ yo'q?
Bu ataylab qilingan: kodni o'qiyotgan odam $narx ni ko'rsa — "bu o'zgarishi mumkin", NARX ni ko'rsa — "bu hech qachon o'zgarmaydi" deb darhol tushunadi. Katta harf ham xuddi shu maqsadda — ko'z bilan tez ajratish uchun. Kompyuterga farqi yo'q, odamga farqi katta.
Tez-tez uchraydigan xatolar
Konstantaga $ qo'yish:
<?php
const LIMIT = 10;
echo $LIMIT;
// Warning: Undefined variable $LIMIT
Ikki marta e'lon qilish:
<?php
define('LIMIT', 10);
define('LIMIT', 20);
// Warning: Constant LIMIT already defined
Massiv va ob'ektlarni konstantaga saqlash: massiv mumkin (const RANGLAR = ['qizil', 'yashil'];), lekin ob'ektni const bilan saqlab bo'lmaydi.
Xulosa
Konstanta — o'zgarmaydigan qiymat uchun nom.
Eslab qoling:
const NOM = qiymat;— asosiy usuldefine('NOM', qiymat);— shart ichida yoki dinamik nom uchun$belgisi yo'q, odatda KATTA_HARFLAR bilandefined('NOM')— mavjudligini tekshirish__DIR__,__FILE__,__LINE__— sehrli konstantalar
Keyingi dars
6-dars: Operatorlar — arifmetik, == va ===, mantiqiy, ??, <=>