Costanti PHP contenenti array?


Answers

Da PHP 5.6, è possibile dichiarare una costante di array con const :

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

Anche la sintassi breve funziona, come ti aspetteresti:

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

Se hai PHP 7, puoi finalmente usare define() , proprio come avevi provato prima:

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

Questo ha fallito:

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

Apparentemente, le costanti non possono contenere array. Qual è il modo migliore per aggirare questo?

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

//...

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

Questo sembra uno sforzo inutile.




So che è una domanda un po 'vecchia, ma ecco la mia soluzione:

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

L'ho definito perché avevo bisogno di memorizzare oggetti e array in costanti, quindi ho installato anche runkit su php in modo da rendere la variabile $ const superglobal.

Puoi usarlo come $const->define("my_constant",array("my","values")); o solo $const->my_constant = array("my","values");

Per ottenere il valore basta chiamare $const->my_constant;




Potresti anche esplodere l'array in una serie di costanti. (una soluzione piuttosto vecchia scuola) Dopo tutto, la matrice è costante , quindi l'unica ragione per cui è necessario è la ricerca globale, veloce, di determinate chiavi.

Quindi questo:

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

Si trasformerebbe in:

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

Sì, c'è l'inquinamento nello spazio dei nomi (e un sacco di prefissi per prevenirlo) da prendere in considerazione.




Fare qualche tipo di ser / deser o trucco di codifica / decodifica sembra brutto e richiede di ricordare cosa esattamente hai fatto quando stai provando ad usare la costante. Penso che la variabile statica privata di classe con accessor sia una soluzione decente, ma te ne farò una migliore. Basta avere un metodo getter statico pubblico che restituisca la definizione dell'array costante. Ciò richiede un minimo di codice aggiuntivo e la definizione dell'array non può essere modificata accidentalmente.

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

initMyRoles( UserRoles::getDefaultRoles() );

Se si vuole veramente far sembrare una costante definita si potrebbe dare un nome tutto maiuscolo, ma sarebbe poi complicato ricordare di aggiungere le parentesi '()' dopo il nome.

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

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

Suppongo che potresti rendere il metodo globale più vicino alla funzionalità define () che stavi richiedendo, ma dovresti comunque esplorare il nome costante ed evitare i globals.




Sì, è possibile definire una matrice come costante. Da PHP 5.6 in poi , è possibile definire una costante come un'espressione scalare ed è anche possibile definire una costante di matrice . È possibile definire le costanti come una risorsa, ma dovrebbe essere evitata, in quanto può causare risultati imprevisti.

<?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"
?>

Con il riferimento di questo link

Buona programmazione.




Può anche funzionare con array associativi .. ad esempio in una classe.

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.



Sono d'accordo con eyze, le costanti tendono ad essere valori di valore singolo necessari per l'intera vita della vostra applicazione. Si potrebbe pensare di usare un file di configurazione invece di costanti per questo genere di cose.

Se hai davvero bisogno di array costanti, puoi usare le convenzioni di denominazione per imitare un po 'gli array: ad esempio DB_Name, DB_USER, DB_HOST, ecc.




È possibile memorizzarlo come una stringa JSON in una costante. E dal punto di vista applicativo, JSON può essere utile in altri casi.

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



Se stai usando PHP 5.6 o superiore, usa la risposta di Andrea Faulds

Lo sto usando in questo modo. Spero, aiuterà gli altri.

config.php

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

Nel file, dove ho bisogno di costanti.

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