it-swarm.com.de

PHP Konstanten, die Arrays enthalten?

Dies ist fehlgeschlagen:

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

Anscheinend können Konstanten keine Arrays enthalten. Was ist der beste Weg, um dies zu umgehen?

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

//...

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

Dies scheint ein unnötiger Aufwand zu sein.

367
Nick Heiner

HINWEIS: Obwohl dies die akzeptierte Antwort ist, ist es erwähnenswert, dass Sie in PHP 5.6+ const Arrays haben können - siehe Andrea Faulds Antwort unten .

Sie können Ihr Array auch serialisieren und dann in die Konstante einfügen:

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

# use it
$my_fruits = unserialize (FRUITS);
480
user156676

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

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

Die kurze Syntax funktioniert auch wie erwartet:

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

Wenn Sie über PHP 7 verfügen, können Sie schließlich define() verwenden, so wie Sie es zuerst versucht haben:

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

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 Ihnen der Gedanke nicht gefällt, dass das Array von anderen geändert werden kann, kann ein Getter hilfreich sein:

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

EDIT

Seit PHP5.4 ist es sogar möglich, auf Array-Werte zuzugreifen, ohne Zwischenvariablen zu benötigen, d. H.

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

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

Ich benutze es so. Ich hoffe, es wird anderen 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 Konstanten brauche.

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

Das ist was ich benutze. Es ist dem Beispiel von soulmerge ähnlich, aber auf diese Weise können Sie das gesamte Array oder nur einen einzelnen 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 so:

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

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

define ("FRUITS", json_encode(array ("Apple", "cherry", "banana")));    
$fruits = json_decode (FRUITS);    
var_dump($fruits);
9
Mahesh Talpade

Beginnend mit PHP 5.6 können Sie konstante Arrays mit dem Schlüsselwort const wie unten definiert definieren

const DEFAULT_ROLES = ['test', 'development', 'team'];

und auf verschiedene Elemente kann wie folgt zugegriffen werden: 

echo DEFAULT_ROLES[1]; 
....

Beginnend mit PHP 7 können konstante Arrays mit define wie folgt definiert werden: 

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

auf verschiedene Elemente kann auf dieselbe Weise wie zuvor zugegriffen werden. 

5
Altaf Hussain

Ich weiß, dass es eine alte Frage ist, 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 habe es definiert, weil ich Objekte und Arrays in Konstanten speichern musste, also habe ich auch Runkit in PHP installiert, damit ich die Variable $ const superglobal machen konnte.

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

Um den Wert zu erhalten, rufen Sie einfach $const->my_constant; auf.

3
Rikudou_Sennin

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

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

Dies wird email widergeben.

Wenn Sie möchten, dass es mehr optimiert, können Sie zwei Funktionen definieren, um die sich wiederholenden Dinge für Sie wie folgt auszuführen:

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

Hoffentlich hilft das . Glückliche Kodierung.

Kann sogar mit assoziativen Arrays arbeiten, 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.
2
Thielicious

Sie können so definieren

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

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

Wenn Sie eine Art Ser/Deser- oder Codierungs-/Decodierungs-Trick ausführen, erscheint das hässlich und Sie müssen sich daran erinnern, was genau Sie getan haben, als Sie die Konstante verwenden wollten. Ich denke, dass die private statische Variable der Klasse mit Accessor eine anständige Lösung ist, aber ich werde es Ihnen besser machen. Verwenden Sie einfach eine öffentliche statische Getter-Methode, die die Definition des konstanten Arrays zurückgibt. Dies erfordert ein Minimum an zusätzlichem Code, und die Array-Definition kann nicht versehentlich geändert werden.

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

initMyRoles( UserRoles::getDefaultRoles() );

Wenn Sie möchten, dass es wirklich wie eine definierte Konstante aussieht, können Sie ihm einen vollständigen Namen geben. Es wäre jedoch verwirrend, wenn Sie daran denken, die Klammern '()' nach dem Namen einzufü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, Sie könnten die Methode global so gestalten, dass sie näher an der von define () gebotenen Funktionalität liegt, aber Sie sollten den konstanten Namen sowieso einschränken und Globals vermeiden.

2
Daniel Skarbek

PHP 7+

Ab PHP 7 können Sie mit der Funktion define () ein konstantes Array definieren:

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

echo ANIMALS[1]; // outputs "cat"
2
Rabin Lama Dong

Ja, Sie können ein Array als konstant definieren. Ab PHP 5.6 und höher kann eine Konstante als skalarer Ausdruck definiert werden, und es ist auch kann eine Array-Konstante definieren. Es ist möglich, Konstanten als Ressource zu definieren, dies sollte jedoch vermieden werden, da dies 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 der Referenz von diesem Link

Hab eine glückliche Kodierung.

1
Sahil Patel

Wenn Sie dies von 2009 betrachten und AbstractSingletonFactoryGenerators nicht mögen, finden Sie hier einige weitere Optionen.

Denken Sie daran, dass Arrays bei der Zuweisung "kopiert" werden oder in diesem Fall zurückgegeben werden, sodass Sie praktisch jedes Mal dasselbe Array erhalten. (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;
}
1
biziclop

Konstanten können nur Skalarwerte enthalten. Ich empfehle Ihnen, die Serialisierung (oder JSON-codierte Darstellung) des Arrays zu speichern.

0
Alix Axel