PHP sabitleri Diziler İçeren?

12 Cevap php

Bu başarısız oldu:

 define('DEFAULT_ROLES', array('guy', 'development team'));

Görünüşe göre, sabitleri diziler tutamaz. Bunu aşmanın en iyi yolu nedir?

define('DEFAULT_ROLES', 'guy|development team');

//...

$default = explode('|', DEFAULT_ROLES);

Bu gereksiz bir çaba gibi görünüyor.

12 Cevap

Ayrıca dizi seri ve daha sonra sabiti içine koyabilirsiniz:

# define constant, serialize array
define ("FRUITS", serialize (array ("apple", "cherry", "banana")));

# use it
$my_fruits = unserialize (FRUITS);

Bir sınıfın statik değişkenler olarak saklayabilirsiniz:

class Constants {
    public static $array = array('guy', 'development team');
}
# Warning: array can be changed lateron, so this is not a real constant value:
Constants::$array[] = 'newValue';

Eğer dizi başkaları tarafından değiştirilebilir fikri beğenmezseniz, bir alıcı yardımcı olabilir:

class Constants {
    private static $array = array('guy', 'development team');
    public static function getArray() {
        return self::$array;
    }
}
$constantArray = Constants::getArray();

EDIT

PHP5.4 bu yana, aşağıdaki işleri örneğin, ara değişkenler için gerek kalmadan dizisi değerlerine ulaşmak için bile mümkündür:

$x = Constants::getArray()['index'];

Ben bu gibi kullanıyorum. Ben başkalarına yardımcı olacaktır, umarım.

config.php

class app{
    private static $options = array(
        'app_id' => 'hello',
    );
    public static function config($key){
        return self::$options[$key];
    }
}

Dosyada, sabitler gereken yere.

require('config.php');
print_r(app::config('app_id'));

Sabitler sadece skaler değerler içerebilir, ben size dizinin serileştirme (veya json kodlanmış gösterimini) depolamak öneririz.

Patlayabilir ve işlevini çökmek kullanarak bir çözüm doğaçlama olabilir:

$array = array('lastname', 'email', 'phone');
define('DEFAULT_ROLES', implode (',' , $array));
echo explode(',' ,DEFAULT_ROLES ) [1]; 

Bu yankı email.

Eğer bunu optimize etmek istiyorsanız daha fazla bu gibi sizin için tekrarlayan şeyler yapmak için 2 fonksiyonları tanımlayabilirsiniz:

//function to define constant
function custom_define ($const , $array) {
    define($const, implode (',' , $array));
}

//function to access constant  
function return_by_index ($index,$const = DEFAULT_ROLES) {
            $explodedResult = explode(',' ,$const ) [$index];
    if (isset ($explodedResult))
        return explode(',' ,$const ) [$index] ;
}

Umut olur. Mutlu kodlama.

Sadece yapamazsınız:

$DEFAULT_ROLES = array('guy', 'development team');

Bu benim ne kullanın. Bu soulmerge tarafından sağlanan örneğe benzer, ancak bu şekilde dizideki tam bir dizi ya da sadece tek bir değer elde edebilirsiniz.

class Constants {
    private static $array = array(0 => 'apple', 1 => 'orange');

    public static function getArray($index = false) {
        return $index !== false ? self::$array[$index] : self::$array;
    }
}

Bu gibi kullanın:

Constants::getArray(); // Full array
// OR 
Constants::getArray(1); // Value of 1 which is 'orange'

Ser / deser veya kodlama / kod çözme hile çeşit yapıyor çirkin görünüyor ve sabit kullanmaya çalıştığınız zaman tam olarak ne yaptığını hatırlamak gerekir. Ben erişgeç ile sınıf özel statik değişken iyi bir çözüm olduğunu düşünüyorum, ama sana bir daha yapacağız. Sadece sabit dizinin tanımını döndüren public static alıcı bir yöntem var. Bu ekstra kod az gerektirir ve dizi tanımı yanlışlıkla değiştirilemez.

class UserRoles {
    public static function getDefaultRoles() {
        return array('guy', 'development team');
    }
}

initMyRoles( UserRoles::getDefaultRoles() );

Eğer gerçekten bir tanımlanmış sabit gibi bakmak yapmak istiyorsanız bunu bir bütün kapaklar isim verebilir, ama sonra adından sonra '()' parantez eklemek için hatırlamak için kafa karıştırıcı olacaktır.

class UserRoles {
    public static function DEFAULT_ROLES() { return array('guy', 'development team'); }
}

//but, then the extra () looks weird...
initMyRoles( UserRoles::DEFAULT_ROLES() );

Ben global yöntemi (için soran) işlevselliğini tanımlamak daha yakın olmak için yapabilir varsayalım, ama sen gerçekten nasıl olsa kapsamı sabit adını olmalı ve küresellerle kaçının.

Ben eyze katılıyorum, sabitler uygulamanın tüm yaşam için gerekli olan tek değer değerler olma eğilimindedir. Siz bu tür bir şey için bir yapılandırma dosyası kullanarak yerine sabitler hakkında düşünebilirsiniz.

Eğer gerçekten sabit diziler gerekiyorsa, biraz mimik diziler adlandırma kullanabilirsiniz: Örneğin vb db_name, DB_USER, DB_HOST için

Yani, sabit, sadece scaler ve null diziler kullanamazsınız, doğrudur. Sabitleri için bir dizi kullanma fikri bana biraz geriye doğru gibi görünüyor.

Ne yapmak yerine önermek kendi sabit sınıfını tanımlamak ve sabit almak için bu kullanmaktır.

Bir sabiti bir JSON dize olarak saklayabilirsiniz. Ve bakış uygulama noktası, JSON diğer durumlarda yararlı olabilir.

define ("FRUITS", json_encode(array ("apple", "cherry", "banana")));    
$fruits = json_decode (FRUITS);    
var_dump($fruits);

Ayrıca sabitler bir dizi içine dizi patlayabilir. (Oldukça eski bir okul çözelti) Sonuçta, dizi constant, bu nedenle sizin için gereken tek nedeni, global, fast, lookup Bazı tuşların olduğunu.

Dolayısıyla bu:

define('DEFAULT_ROLES', array('guy', 'development team'));

: Dönüşecekti

define('DEFAULT_ROLES_0', 'guy');
define('DEFAULT_ROLES_1', 'development team');

Evet, ad kirlilik (ve bunu önlemek için önek bir sürü) dikkate almak var.