Sabit, betik çalışırken hiç değişmeyen bir değere verilen addır. const MAX_USERS = 100; veya define('MAX_USERS', 100); ile tanımlayın, sonra $ olmadan yalın adını kullanın.
Gelenek olarak sabit adları UPPER_SNAKE_CASE ile yazılır. Sabitler globaldir: bir dosyanın başında tanımlanan bir sabit, global olmadan her fonksiyonun içinde görünür.
define() ile const
İkisi de bir sabit oluşturur, ama farklı zamanlarda çalışırlar. const, PHP dosyayı derlerken çözümlenir; define() ise diğer fonksiyon çağrıları gibi çalışır.
const | define() | |
|---|---|---|
if, döngü ve fonksiyonların içinde | Hayır | Evet |
| Bir değişkenden oluşturulan ad | Hayır | Evet |
| Sınıf sabitleri | Evet | Hayır |
| Değer bir ifade olabilir | Evet, sabitlerden ve değişmezlerden | Evet, her değer |
| Otomatik olarak namespace'e alınır | Evet | Hayır (tam adı verin) |
Varsayılan olarak const kullanın, çünkü daha kısadır ve derleme zamanında kontrol edilir. Sabit bir koşula veya hesaplanan bir ada bağlı olduğunda define() kullanın.
Sabitler değiştirilemez
Bir sabite atama yapmak bir ayrıştırma hatasıdır:
<?php
const LIMIT = 10;
LIMIT = 20;
PHP Parse error: syntax error, unexpected token "=" in /home/index.php on line 3
Aynı sabiti iki kez tanımlamak bir hata değildir, ama PHP bir uyarı yazdırır ve ilk değeri korur:
<?php
define("LIMIT", 10);
define("LIMIT", 20);
echo LIMIT; // 10
Warning: Constant LIMIT already defined in /home/index.php on line 3
Bir değer zaten atanmış olabiliyorsa (örneğin birden fazla kez yüklenen bir yapılandırma dosyasında), önce defined() ile kontrol edin:
Sabit diziler
Bir sabit bir dizi tutabilir. Onu NAME[key] ile okuyabilir, üzerinde döngü kurabilir ve bir yerden bir yere geçirebilirsiniz, ama değiştiremezsiniz.
Sınıf sabitleri
Bir sınıfın içinde const, sınıfa ait bir sabit tanımlar. Dışarıdan ClassName::NAME, içeriden self::NAME veya static::NAME ile okuyun. Sınıf sabitlerinin görünürlüğü olabilir, final olabilirler ve PHP 8.3'ten beri bir tür bildirebilirler.
STATUS_NEW ve STATUS_PAID gibi birbiriyle ilişkili sınıf sabitlerinden oluşan bir grup çoğu zaman bir enum olarak daha iyi yazılır; enum geçersiz değerlerin dolaşmasını da engeller.
Sihirli sabitler: LINE, FILE, DIR ve dahası
Sihirli sabitlerin değeri göründükleri yere göre değişir. Derleme zamanında doldurulurlar.
En çok kullanılanı, mevcut dosyanın dizini olan __DIR__ sabitidir. include yollarını ondan oluşturmak, betik hangi dizinden başlatılırsa başlatılsın onların çalışmasını sağlar: require __DIR__ . '/config.php';. Kalıbın tamamı için include ve require sayfasına bakın.
Bilinmesi gereken yerleşik sabitler
PHP'nin kendi tanımladığı birçok sabit vardır. Bunlar sürekli karşınıza çıkar:
PHP_EOL, PHP'nin çalıştığı sistemin satır sonudur (Linux ve macOS'ta "\n", Windows'ta "\r\n"). Dosyalara ve terminale yazılan metin içindir; HTML çıktısında yeni satır görünmez, bu yüzden orada <br> kullanın.
Sıkça Sorulan Sorular
PHP'de define() ile const arasındaki fark nedir?
const dosya derlenirken çözümlenen bir dil yapısıdır: en üst seviyede ve sınıfların içinde çalışır, ama if, döngüler veya fonksiyonların içinde çalışmaz. define() ise çalışma zamanında çağrılan bir fonksiyondur; bu yüzden her yerde çalışır ve ad bir değişkenden oluşturulabilir, ama sınıf sabiti tanımlayamaz.
Bir PHP sabiti dizi olabilir mi?
Evet. Hem const COLORS = ['red', 'green']; hem de define('COLORS', ['red', 'green']); çalışır ve bir elemanı COLORS[0] ile okursunuz. Dizi sonradan değiştirilemez.
PHP'de bir sabitin tanımlı olup olmadığını nasıl kontrol ederim?
Adı string olarak alan ve true ya da false döndüren defined('NAME') kullanın. Yaygın bir kalıp if (!defined('APP_ENV')) { define('APP_ENV', 'production'); } şeklindedir. Sınıf sabitleri için 'ClassName::NAME' geçirin.
PHP'de sihirli sabitler nedir?
Değeri yazıldıkları yere bağlı olan sabitlerdir: __LINE__ (mevcut satır), __FILE__ (dosyanın tam yolu), __DIR__ (dizini), __FUNCTION__, __CLASS__, __METHOD__ ve __NAMESPACE__. Her iki yanlarında iki alt çizgiyle yazılırlar ve büyük/küçük harfe duyarlı değildirler.