Konstantalar — define(), const, sehrli konstantalar

~10 daq · PHP · Kirish va Asoslar

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 usul
  • define('NOM', qiymat); — shart ichida yoki dinamik nom uchun
  • $ belgisi yo'q, odatda KATTA_HARFLAR bilan
  • defined('NOM') — mavjudligini tekshirish
  • __DIR__, __FILE__, __LINE__ — sehrli konstantalar

Keyingi dars

6-dars: Operatorlar — arifmetik, == va ===, mantiqiy, ??, <=>