Frage

Dies ist fehlgeschlagen:

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

Offenbar können Konstanten nicht Arrays halten. Was ist der beste Weg, dies zu umgehen?

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

//...

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

Dies scheint unnötiger Aufwand.

War es hilfreich?

Lösung

Hinweis: während dies die akzeptierte Antwort ist, dann ist es erwähnenswert, dass in PHP 5.6+ Sie const Arrays können - zu sehen Andrea Faulds' Antwort unten .

Sie können auch Ihre Array serialisiert werden und es dann in die Konstante:

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

# use it
$my_fruits = unserialize (FRUITS);

Andere Tipps

Seit PHP 5.6 können Sie einen Array-Konstante mit const deklarieren:

<?php
const DEFAULT_ROLES = array('guy', 'development team');

Die kurze Syntax funktioniert auch, wie man erwarten würde:

<?php
const DEFAULT_ROLES = ['guy', 'development team'];

Wenn Sie PHP 7, Sie endlich define() verwenden können, wie Sie es zuerst versucht hatte:

<?php
define('DEFAULT_ROLES', array('guy', 'development team'));

Sie können sie als statische Variablen einer Klasse speichern:

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';

Wenn Sie nicht wie die Idee, dass die Anordnung von anderen geändert werden kann, ein Getter helfen könnte:

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

Bearbeiten

Da PHP5.4, ist es sogar möglich, Feldwerte zuzugreifen, ohne die Notwendigkeit von Zwischenvariablen, das heißt, die folgenden Werke:

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

Wenn Sie PHP 5.6 oder höher verwenden, verwenden Andrea Faulds Antwort

ich es so verwenden. Ich hoffe, es wird andere helfen.

config.php

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

In der Datei, wo ich brauche Konstanten.

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

Dies ist, was ich benutze. Es ist ähnlich dem Beispiel von soulmerge zur Verfügung gestellt, aber auf diese Weise können Sie die vollständige Palette oder einfach nur einen einzigen Wert im Array erhalten.

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

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

Verwenden Sie es wie folgt aus:

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

Sie können es speichern als JSON-String in einer Konstante. Und Anwendung Sicht, JSON kann in anderen Fällen nützlich sein.

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

Beginnend mit PHP 5.6 können Sie unter

Konstante Arrays const Schlüsselwörter wie definieren
const DEFAULT_ROLES = ['test', 'development', 'team'];

und andere Elemente können wie unten zugegriffen werden:

echo DEFAULT_ROLES[1]; 
....

Beginnend mit PHP 7, konstanter Arrays definiert werden kann, wie unten mit define:

define('DEFAULT_ROLES', [
    'test',
    'development',
    'team'
]);

und andere Elemente können gleiche Art und Weise wie zuvor zugegriffen werden.

Ich weiß, es ist ein bisschen alte Frage, aber hier ist meine Lösung:

<?php
class Constant {

    private $data = [];

    public function define($constant, $value) {
        if (!isset($this->data[$constant])) {
            $this->data[$constant] = $value;
        } else {
            trigger_error("Cannot redefine constant $constant", E_USER_WARNING);
        }
    }

    public function __get($constant) {
        if (isset($this->data[$constant])) {
            return $this->data[$constant];
        } else {
            trigger_error("Use of undefined constant $constant - assumed '$constant'", E_USER_NOTICE);
            return $constant;
        }
    }

    public function __set($constant,$value) {
        $this->define($constant, $value);
    }

}
$const = new Constant;

ich es definiert, da ich brauchte Objekte und Arrays in Konstanten zu speichern, damit ich auch installiert runkit php, so konnte ich die $ const Variable superglobal machen.

Sie können es als $const->define("my_constant",array("my","values")); verwenden oder einfach nur $const->my_constant = array("my","values");

Um den Wert zu erhalten, einfach nur rufen $const->my_constant;

Mit explodieren und implodieren Funktion können wir eine Lösung improvisiert:

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

Dies wird echo email.

Wenn Sie es wollen, es zu optimieren mehr Sie 2 Funktionen definieren können, die sich wiederholende Dinge für Sie wie dies zu tun:

//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] ;
}

Ich hoffe, das hilft. Glückliche Codierung.

Ihr irgendeine Art von ser / deser oder Encoder / Decoder-Trick scheint hässlich und zwingt Sie, sich daran zu erinnern, was genau haben Sie, wenn Sie versuchen, die Konstante zu verwenden. Ich denke, die Klasse private static Variable mit Accessor eine anständige Lösung ist, aber ich werde Ihnen eine besser machen. Nur eine public static Getter-Methode, die die Definition des konstanten Array zurückgibt. Dies erfordert ein Minimum an zusätzlichem Code und die Felddefinition nicht versehentlich geändert werden.

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

initMyRoles( UserRoles::getDefaultRoles() );

Wenn Sie wirklich wollen, um es wie eine definierte Konstante aussehen lassen Sie ihm ein All-Kappen Namen geben könnten, aber dann wäre es verwirrend sein, daran zu erinnern, das ‚()‘ Klammern nach dem Namen hinzuzufügen.

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

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

Ich denke, man könnte das Verfahren global machen, um näher an den define () Funktionalität, die Sie für fragen, aber man wirklich Umfang soll den ständigen Namen sowieso und Globals vermeiden.

Sie können wie folgt definieren

define('GENERIC_DOMAIN',json_encode(array(
    'gmail.com','gmail.co.in','yahoo.com'
)));

$domains = json_decode(GENERIC_DOMAIN);
var_dump($domains);

PHP 7 +

Ab PHP 7, können Sie einfach die definieren () Funktion einen konstanten Array zu definieren:

define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[1]; // outputs "cat"

Kann auch mit assoziativen Arrays arbeitet .. zum Beispiel in einer Klasse.

class Test {

    const 
        CAN = [
            "can bark", "can meow", "can fly"
        ],
        ANIMALS = [
            self::CAN[0] => "dog",
            self::CAN[1] => "cat",
            self::CAN[2] => "bird"
        ];

    static function noParameter() {
        return self::ANIMALS[self::CAN[0]];
    }

    static function withParameter($which, $animal) {
        return "who {$which}? a {$animal}.";
    }

}

echo Test::noParameter() . "s " . Test::CAN[0] . ".<br>";
echo Test::withParameter(
    array_keys(Test::ANIMALS)[2], Test::ANIMALS["can fly"]
);

// dogs can bark.
// who can fly? a bird.

Ja, Sie können ein Array als Konstante definieren. PHP 5.6 ab , ist es möglich, eine Konstante als skalare Ausdruck zu definieren, und es ist auch möglich, eine Array-Konstante zu definieren. Es ist möglich, Konstanten als Ressource zu definieren, aber es sollte vermieden werden, da es zu unerwarteten Ergebnissen führen kann.

<?php
    // Works as of PHP 5.3.0
    const CONSTANT = 'Hello World';
    echo CONSTANT;

    // Works as of PHP 5.6.0
    const ANOTHER_CONST = CONSTANT.'; Goodbye World';
    echo ANOTHER_CONST;

    const ANIMALS = array('dog', 'cat', 'bird');
    echo ANIMALS[1]; // outputs "cat"

    // Works as of PHP 7
    define('ANIMALS', array(
        'dog',
        'cat',
        'bird'
    ));
    echo ANIMALS[1]; // outputs "cat"
?>

Mit dem Bezug von diesem Link

Hat

eine glückliche Codierung.

Wenn Sie schauen, das aus dem Jahr 2009, und Sie nicht AbstractSingletonFactoryGenerators mögen, hier sind ein paar andere Optionen.

Denken Sie daran, Arrays „kopiert“ werden, wenn zugeordnet, oder in diesem Fall zurückgegeben, so dass Sie praktisch die gleiche Array bekommen jedes Mal. (Siehe copy-on-write Verhalten von Arrays in PHP.)

function FRUITS_ARRAY(){
  return array('chicken', 'mushroom', 'dirt');
}

function FRUITS_ARRAY(){
  static $array = array('chicken', 'mushroom', 'dirt');
  return $array;
}

function WHAT_ANIMAL( $key ){
  static $array = (
    'Merrick' => 'Elephant',
    'Sprague' => 'Skeleton',
    'Shaun'   => 'Sheep',
  );
  return $array[ $key ];
}

function ANIMAL( $key = null ){
  static $array = (
    'Merrick' => 'Elephant',
    'Sprague' => 'Skeleton',
    'Shaun'   => 'Sheep',
  );
  return $key !== null ? $array[ $key ] : $array;
}

Konstanten können nur skalare Werte enthalten, empfehle ich Ihnen die Serialisierung speichern (oder JSON codierte Darstellung) des Arrays.

ich mit eyze zustimmen, eher Konstanten für die gesamte Lebensdauer Ihrer Anwendung benötigten einzelner Wert Werte. Man könnte denken, über eine Konfigurationsdatei anstelle von Konstanten für diese Art der Sache verwendet wird.

Wenn Sie wirklich konstanten Arrays benötigen, könnten Sie Konventionen etwas Mimik Arrays verwenden Namensgebung. Zum Beispiel DB_Name, DB_USER, DB_HOST, etc

Das ist richtig, Sie nicht Arrays für einen konstanten, nur Scaler und null verwenden können. Die Idee der Verwendung eines Arrays für Konstanten scheinen ein wenig nach hinten zu mir.

Was ich vorschlagen, anstatt zu tun ist, Ihre eigene konstante Klasse definieren und verwenden Sie die Konstante zu erhalten.

define('MY_ARRAY_CONSTANT_DELIMETER', '|');       
define('MY_ARRAY',implode(MY_ARRAY_CONSTANT_DELIMETER,array(1,2,3,4)));

//retrieving the array
$my_array = explode(MY_ARRAY_CONSTANT_DELIMETER, MY_ARRAY);

Sie können auch die Anordnung in eine Reihe von Konstanten explodieren. (Eine ziemlich alte Schule Lösung) Schließlich ist das Array Konstante , so dass der einzige Grund, warum Sie es für benötigen, ist global, schnell, Lookup bestimmter Tasten.

Daher folgt aus:

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

würde sich in:

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

Ja, es ist Namespace Verschmutzung (und eine Menge prefixing es zu verhindern) zu berücksichtigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top