PHP ve Sabit Tanımlamalar

PHP’de değişkenlerden başka kullanabileceğimiz bir de sabitler vardır. Sabitler, tanımlandıktan sonra değiştirilemezler. Birkaç örnek verelim.

define('SABIT', 'foo');
var_dump(SABIT);

Sabitler, programlama dillerinde genellikle büyük harflerle tanımlanırlar. Bu genel bir gelenektir, daha farklı biçimlerde de kullanılabilir elbette. Sabitleri bir kere tanımladıktan sonra başka bir yerde değiştiremiyorsunuz ve yeniden tanımlayamıyorsunuz. Yani şöyle:

define('TEST', 'foo');
define('TEST', 'bar');
// Hata: Notice: Constant test already defined in /var/www/constant.php on line 2

Sabitlerin Kontrolü

Bir sabit tanımlı olup olmadığını kontrol etmemize yarayan fonksiyonlar da var. defined fonksiyonu sayesinde, sabitin tanımlı olup olmadığını öğrenebiliyoruz. Kullanalım:

define('TEST', 'foo');

defined('TEST') or define('TEST', 'foo'); // Tanımlamaz, çünkü zaten tanımlı
defined('DENEME') or define('DENEME', 'bar'); // Tanımlar, çünkü tanımlı değil

var_dump(defined('DIGER')); // bool(false)

Sabitlere Tanımlayabileceğimiz Türler

Sabitlere, değişkenleri tanımlayabiliriz fakat daha sonrasında değişkene yeni bir değer verdiğimizde sabitin değeri değişmez. Yani;

$foo = 'bar';
define('TEST', $foo);
$foo = 'baz';
var_dump(TEST); // string(3) "bar"

Sabitlere değer döndüren fonksiyon tanımladığımı test ettim (sürüm 5.4) fakat anonim fonksiyonlar sabitlere tanımlanmıyor.

function foo($bar) {
    return (string) $bar;
}

define('TEST', foo('test'));
var_dump(TEST); // string(4) "test"

// Hatalı kullanım:
define('TEST', function(){
    return 'foo';
});

Sabitlerde şimdilik dizi (array) tanımlaması yapamıyoruz ama PHP 7’de bunu kullanabileceğiz. PHP 7 ile çalıştırdığımızı varsayalım:

define('FOO', ['bar' => 'Bar...', 'baz' => 'Baz...']);
var_dump(FOO['bar']); // string(6) "Bar..."

Sınıflardaki Sabitler

Sınıf içerisinde kullandığımız sabitlerde, normalde kullandıklarımızla benzerlikler taşır. Bu sabitlerde daha sonrasında üzerine yazılamaz ve değiştirilemez. Sadece okumak içindir. Örneğimizi inceleyelim:

class Test
{
    const FOO = 'Sabit';

    public function bar()
    {
        return self::FOO;
    }
}

$test = new Test;
var_dump($test->bar()); // string(5) "Sabit"
var_dump(Test::FOO); // string(5) "Sabit"

Bu yapı yalnızca PHP 5.3 ve sonrasında kullanılabilir.

Sabitlerin Kullanım Yerleri

Sabitler daha çok ayar/konfigürasyon (config) dosyalarında kullanılırlar. Örneğin bir veritabanı bağlantı ayarları veya dizin belirleme ayarları gibi. Örnekleyelim:


defined('DB_DSN') or define('DB_DSN', 'mysql:host=localhost;dbname=veritabani');
defined('DB_USR') or define('DB_USR, 'root');
defined('DB_PWD') or define('DB_PWD', null);

$pdo = new PDO(DB_DSN, DB_USR, DB_PWD);

Bu şekilde veritabanı bağlantısını daha kontrollü biçimde yapabiliyoruz. İstersek sınıflar içinden de erişebiliyoruz. Başka bir senaryoda ise, dizin yapılarını kontrolümüz altında tutmak isteyelim.

defined('KOK_DIZIN') or define('KOK_DIZIN', __DIR__);
defined('UYG_DIZINI') or define('UYG_DIZINI', KOK_DIZIN.'/app');
defined('SINIFLAR') or define('SINIFLAR', KOK_DIZIN.'/classes');
defined('GORUNUMLER') or define('GORUNUMLER', KOK_DIZIN.'/views');

Herhangi bir yerde betik içine sınıf dahil etmek istediğimizde, yeniden dizin yolunu yazmak yerine sabit sayesinde tek sefer çağırabiliriz: require SINIFLAR.'/database.class.php'; gibi. Bu şekilde bir kullanım yapmak, daha sonrasında sınıflarının dizin yolunu değiştirdiğimizde de bizi zorlamayacaktır.

Sabitlerin Kullanımı ve Performans

Hiç istatistik ve ölçüm bulamadım fakat değişkenlerle global sabitleri karşılaştırdığımız vakit, sabitler değişkenlere nazaran daha yavaşmış. Yalnız bunu sınıflar için söyleyemem.

Kolay gelsin.