PHP sabitleri: Avantajları / Dezavantajları

6 Cevap php

Son zamanlarda sabitler tamsayı değerler atama ve sadece amacını tanımlayan bir aracı olarak sabit adını kullanarak alışkanlığı oldum. Ancak, bazı durumlarda bu bir dize temsili gerektiğinde typeToString ($ Kat) gibi bir işlevi yazmak için ihtiyaç sonuçlandı. Açıkçası bu verimsiz ve gereksiz olduğunu, ancak bir sorun her seferinde bir süre olduğunu.

Yani, ben düşünmelisiniz başka makasına benim soru var mı? Bu durumda temizleyici / daha standartlarla uyumlu olarak kabul edilir? Ayrıca, çoğu için performans farkı negligable?

Case 1: (faster when a string version is not needed?)

class Foo {
    const USER_TYPE_ADMIN = 0;
    const USER_TYPE_USER = 1;
    const USER_TYPE_GUEST = 2;

    public $userType = self::USER_TYPE_ADMIN;

    public function __construct($type) {
    	$this->userType = $type;
    }

    public function typeToString() {
    	switch($this->userType) {
    		case self::USER_TYPE_ADMIN:
    			return 'admin';
    			break;

    		case self::USER_TYPE_USER:
    			return 'user';
    			break;

    		case self::USER_TYPE_GUEST:
    			return 'guest';
    			break;

    		default:
    			return 'unknown';
    			break;
    	}
    }
}

$foo = new Foo(Foo::USER_TYPE_GUEST);
echo $foo->typeToString();
// Displays "guest"

Case 2:(faster/easier when a string version is needed)

class Foo {
    const USER_TYPE_ADMIN = 'admin';
    const USER_TYPE_USER = 'user';
    const USER_TYPE_GUEST = 'guest';

    public $userType = self::USER_TYPE_ADMIN;

    public function __construct($type) {
    	$this->userType = $type;
    }
}

$foo = new Foo(Foo::USER_TYPE_GUEST);
echo $foo->userType();
// Displays "guest"

6 Cevap

The performance difference will be negligible unless you're storing a lot of them. I'd write the toString() method more concisely:

$strings = array
(
    self::USER_TYPE_ADMIN => 'admin',
    self::USER_TYPE_USER => 'user',
);

if (!isset($strings[$type]))
    return 'unknown';

return $strings[$type];

Ayrıca, $strings dizisi static yapabiliriz.

Ben dürüst olacağım, dizeleri olarak doğal sizin sabitleri tanımlamak zaman herhangi bir türde bir performans "hit" varsa ben bilmiyorum - ama hiç biri varsa ben o olurdu küçük bahse hazırım ölçmek zordur.

Sabitin değeri değişmez olarak anlamlı ise şahsen, o sadece bunu bu değer atayın. Sabitin değerinin yalnızca bir seçenek seçici (veya değer diğer bazı indication) olarak anlamlı ise, o zaman uygun seçim ne olursa olsun tamsayıları kullanın ya.

Filan erken optimizasyon.

Ben dize sabitleri bu durumda en iyi seçim olduğunu düşünüyorum. Kod iyi görünüyor.

Performansta son bit gerekiyorsa tabii ki, tamsayı sabitleri kullanın. Ama dize karşılaştırmaları darboğaz olduğu bir profiler ile kontrol sonra. Neyse, çoğu uygulamada vb veritabanı erişimi gibi daha birçok pahalı şeyler vardır

Bunun yerine const tamsayılar kullanarak bunları yazdırmak gerekiyorsa ben genellikle sadece dizeleri ile gitmek. Yani $foo = new Foo('guest'); gibi bir şey yapmak istiyorum. Ben hala yapıcı giriş doğrulamak ve bunu gerektiğinde ben o kadar işaretleyebilirsiniz.

Örnekte Eğer tüm yöntemleri bırakın ve sınıf statik yapabilir yazmak ve kendini bir Listeleyicisi yaratacaktı. Bu gibi:

class Enumeration{
  public static const One=1;
  public static const Two=2;
  public static const Three=3;
}

Sabitleri kullanmak için bir diğer kullanışlı yolu, uygulama yapılandırması olarak kullanmaktır. Onlar bilge sonra yapılandırma için bir xml dosyası ayrıştırma çok daha hızlı performans vardır.