SORU
15 Mart 2010, PAZARTESİ


() tanımlamak vs inş

Oldukça basit bir soru: PHP, zaman kullanıyorsunuz

define('FOO', 1);

ve ne zaman kullanıyorsunuz

const FOO = 1;

Bu ikisi arasındaki temel farklar nelerdir?

CEVAP
7 Temmuz 2010, ÇARŞAMBA


PHP 5.3 define constants iki yolu var: Ya const anahtar kelime kullanarak veya define() fonksiyonu

const FOO = 'BAR';
define('FOO', 'BAR');

Bu iki yöntem arasındaki temel fark const derleme zamanında sabit tanımlayan, define zamanında onları tanımlar ise. Bu const'nin dezavantajları. en neden const bazı dezavantajları vardır:

  • const koşullu sabitleri tanımlamak için kullanılamaz. Genel bir sabit tanımlamak için, en dıştaki kapsamında kullanılmak için vardır:

    if (...) {
        const FOO = 'BAR';    // invalid
    }
    // but
    if (...) {
        define('FOO', 'BAR'); // valid
    }
    

    Bu yüzden zaten yapmak ister misin? Ortak bir uygulama sürekli zaten tanımlı olup olmadığını kontrol etmek için:

    if (!defined('FOO')) {
        define('FOO', 'BAR');
    }
    
  • const statik bir skaler (sayı veyatrue, false, , *null*23 dize diğer sabit gibi), define() ise herhangi bir ifade alır kabul eder. PHP beri 5.6 sabit ifade const de: izin verilir

    const BIT_5 = 1 << 5;    // valid since PHP 5.6, invalid previously
    define('BIT_5', 1 << 5); // always valid
    
  • const define() adı gibi herhangi bir ifade kabul eder, ancak, normal bir sabit adını alır. Bu gibi şeyler yapmanızı sağlar:

    for ($i = 0; $i < 32;   $i) {
        define('BIT_' . $i, 1 << $i);
    }
    
  • constdefine() üçüncü değişken olarak true geçirerek büyük / küçük harf duyarlı sabitleri tanımlamak ise her zaman büyük / küçük harfe duyarlıdır:

    define('FOO', 'BAR', true);
    echo FOO; // BAR
    echo foo; // BAR
    

Yani, bu işleri daha da kötü tarafı. Şimdi yukarıdaki durumlardan biri meydana gelmedikçe ben şahsen her zaman const kullanım sebebi bak:

  • const sadece güzel okur. Bir işlevi yerine inşa ve aynı zamanda sınıflar sabitleri tanımlamak ne kadar tutarlı bir dil.
  • const define() tam ad adı onaylanmadı süre geçerli ad sabit tanımlar:

    namespace A\B\C;
    // To define the constant A\B\C\FOO:
    const FOO = 'BAR';
    define('A\B\C\FOO', 'BAR');
    
  • PHP beri const 5.6 sabitler define() diziler henüz desteklemiyor olsa diziler olabilir. Ancak diziler PHP 7 her iki durumda da desteklenecek.

    const FOO = [1, 2, 3];    // valid in PHP 5.6
    define('FOO', [1, 2, 3]); // invalid in PHP 5.6, valid in PHP 7.0
    
  • consts dil yapıları ve derleme zamanında tanımlanan biraz daha hızlı define()s daha.

    Sabitleri çok sayıda kullanırken PHP define()s yavaş olduğu bilinmektedir. İnsanlar bile apc_load_constants() hidef gibi şeyler bunun önüne geçmek için icat var.

    consts sabitleri tanımı yaklaşık iki kat daha hızlı (geliştirme üzerinde XDebug ile makineler daha açık olun. Öte yandan zaman değiştirmez arama hem de sürekli aynı türleri arama tablosu paylaşın. Demo.

Son olarak, const ayrıca bir sınıf veya arabirim içinde class constant veya arabirim bir sabit tanımlamak için kullanılabilir olduğunu unutmayın. define bu amaç için kullanılamaz:

class Foo {
    const BAR = 2; // valid
}
// but
class Baz {
    define('QUX', 2); // invalid
}

Özet

Koşullu ifade veya tanım her tür ihtiyacın yoksa, sadece okunabilirlik uğruna define()s yerine consts kullanın!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
Php

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • joshsnice

    joshsnice

    28 Kasım 2006
  • psidot

    psidot

    2 Kasım 2006
  • Rayone GB

    Rayone GB

    14 Temmuz 2007