452 Stimmen

PHP-Konstanten, die Arrays enthalten?

Dies ist fehlgeschlagen:

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

Offenbar 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.

4voto

Sahil Patel Punkte 1491

Ja, Sie können ein Array als konstant definieren. Von PHP 5.6 aufwärts ist es möglich, eine Konstante als skalaren Ausdruck zu definieren, und es ist auch Möglichkeit, eine Array-Konstante zu definieren . Es ist zwar möglich, Konstanten als Ressource zu definieren, doch sollte dies 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 Hinweis auf die dieser Link

Viel Spaß beim Kodieren.

4voto

Rikudou_Sennin Punkte 1204

Ich weiß, die Frage ist etwas alt, 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 $const-Variable superglobal machen konnte.

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

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

3voto

Fawwad Punkte 131

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

3voto

Daniel Skarbek Punkte 555

Eine Art ser/deser oder encode/decode-Trick scheint unschön zu sein und erfordert, dass man sich daran erinnert, was genau man getan hat, wenn man versucht, die Konstante zu verwenden. Ich denke, die Klasse private statische Variable mit Accessor ist eine anständige Lösung, aber ich werde Ihnen einen besseren Vorschlag machen. Man braucht nur 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 es wirklich wie eine definierte Konstante aussehen lassen wollen, könnten Sie ihm einen Namen in Großbuchstaben geben, aber dann wäre es verwirrend, sich daran zu erinnern, die 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 nehme an, Sie könnten die Methode global machen, um näher an der define()-Funktionalität zu sein, nach der Sie gefragt haben, aber Sie sollten den Namen der Konstante sowieso in den Gültigkeitsbereich einbeziehen und Globals vermeiden.

3voto

Mit Hilfe der Funktionen explode und implode können wir eine Lösung improvisieren:

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

Dies führt zu einem Echo email .

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

//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. Viel Spaß beim Codieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X