PHP5 enum türlerine alternatif?

3 Cevap php

Ben başka bir mesaj geçen bir PHP5 nesne var ve her bir mesajın bir tür eklemek istiyorum. Örneğin, MSG_HOT, MSG_WARM ve MSG_COLD. PHP5 bir enum türü olsaydı, muhtemelen mesaj türlerini tanımlamak için kullanabilirsiniz, ama (ben yanılmıyorsam) böyle bir hayvan yoktur. Ben birkaç seçenek baktım:

Ben kaçınılmaz 'MSG_WRAM' ve şeyler kıracak gibi bir şey yazarsınız, çünkü Strings ('MSG_HOT', 'MSG_WARM', ve 'MSG_COLD') kötü. Sayılar aynı sorunu muzdarip ve aynı zamanda daha az açıktır.

Iş tanımlar:

define('MSG_HOT', 1);
define('MSG_WARM', 2);
define('MSG_COLD', 3);

ancak küresel ad kirleten ve böylece teklik sağlamak için daha ayrıntılı isimleri gerektirir. Benim kod APPLICATIONNAME_MESSAGES_TYPE_HOT gibi şeyler ile çevrili olmasını tercih ederim.

Son olarak, ben bu yüzden gibi tiplerini ayırt etmek için sınıf adları kullanabilirsiniz:

class MessageHot extends Message {}
class MessageWarm extends Message {}
class MessageCold extends Message {}
class Message
{
    public function Type()
    {
        return get_class($this);
    }
    public function Data()
    {
        return $this->data;
    }
    public function __construct($data)
    {
        $this->data = $data;
    }
    private $data;
}

Bu iyi, ben düşünüyorum, ama aynı zamanda basit bir kavram olması gerektiğini gibi göründüğü için bir sürü iş olduğunu.

Ben daha iyi bir alternatif eksik?

3 Cevap

Çok yaygın bir kongre PHP sınıfı sabitleri kullanmaktır.

örneğin

class Message
{
    const HOT  = 0;
    const WARM = 1;
    const COLD = 2;
}

Ben de bunun için consts ile bir sınıf kullanabilirsiniz. Ben şu ekleyin

  • emin olmak için, sınıf soyut hale kimse örneğini çalışır
  • dostu mesajları yazdırmak için dizeleri consts eşler statik bir dizi eklemek
  • önceki yapmak için bir statik __ toString () yöntemini uygulamak

    abstract class Message {
        const HOT = 0;
        const WARM = 1;
        const COLD = 2;
    
    
    
    public static $enums= array(
        self::HOT => "hot",
        self::WARM => "warm",
        self::COLD => "cold"
    );
    
    
    public static __toString($enum) {
        return self::$enums[$enum];
    }
    
    }

Ben de değişkenleri test Mesajınız :: $ çeteleler kullanabilirsiniz:

if (!array_key_exists($is_it_valid, Message::$enums)

Sen kullanabilirsiniz class constants:

class Message
{
    const hot = 0;
    const warm = 1
    const cold = 2;
}

foo(Message::hot);