web-dev-qa-db-ja.com

配列を含むPHP定数

これは失敗しました:

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

どうやら、定数は配列を保持することはできません。これを回避するための最良の方法は何ですか?

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

//...

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

これは不必要な努力のようです。

375
Nick Heiner

注:これは一般的な回答ですが、PHP 5.6以降ではconst配列を使用できることに注意してください - Andrea Fauldsの回答を参照以下

配列をシリアル化してから定数に入れることもできます。

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

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

PHP 5.6以降、constを使用して配列定数を宣言できます。

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

ご想像のとおり、短い構文も機能します。

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

PHP 7がある場合は、最初に試したときと同じように、最後にdefine()を使用できます。

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

それらをクラスの静的変数として格納することができます。

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

配列が他の人によって変更される可能性があるという考えが気に入らない場合は、getterが役立ちます。

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

EDIT

PHP 5.4以降、中間変数を必要とせずに配列の値にアクセスすることさえ可能です。

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

PHP 5.6以上を使用している場合は、Andrea Faulds answer を使用してください

こんな感じで使っています。私はそれが他の人を助けることを願っています。

config.php

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

ファイル内で、ここで定数が必要です。

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

これが私が使っているものです。それはsoulmergeによって提供された例に似ています、しかしこの方法であなたは完全な配列か配列のただ一つの値を得ることができます。

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

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

このように使用してください。

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

JSON文字列として定数に格納できます。アプリケーションの観点から、JSONは他の場合にも役立ちます。

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

PHP 5.6以降では、以下のようにconstキーワードを使用して定数配列を定義できます。

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

そして、以下のようにさまざまな要素にアクセスできます。

echo DEFAULT_ROLES[1]; 
....

PHP 7以降、定数配列は以下のようにdefineを使用して定義できます。

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

異なる要素には以前と同じ方法でアクセスできます。

6
Altaf Hussain

私はそれが少し古い質問であることを知っています、しかしここに私の解決策があります:

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

オブジェクトと配列を定数で格納する必要があったので、私はそれを定義しました。それで私は$ const変数をスーパーグローバルにできるようにランキットをphpにもインストールしました。

あなたはそれを$const->define("my_constant",array("my","values"));または単に$const->my_constant = array("my","values");として使うことができます

値を取得するには、単に$const->my_constant;を呼び出すだけです。

3
Rikudou_Sennin

分解および分解関数を使用して、解を即興することができます。

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

これはemailを反映します。

もっと最適化したい場合は、次のように2つの関数を定義して、繰り返し行うことができます。

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

それが役立つことを願っています。ハッピーコーディング.

連想配列を扱うことさえできます。例えばクラスで。

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

あなたはこのように定義することができます

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

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

ある種のser/deserまたはencode/decodeのトリックを行うのは醜いように思われ、定数を使用しようとしたときに行ったことを正確に覚えておく必要があります。私はアクセサを持つクラスのプライベート静的変数はまともな解決策だと思いますが、私はあなたがもっと上手くやるつもりです。定数配列の定義を返すpublic static getterメソッドを持ってください。これには最小限のコードが必要であり、配列定義を誤って変更することはできません。

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

initMyRoles( UserRoles::getDefaultRoles() );

本当にそれを定義済み定数のように見せたい場合は、それに全大文字の名前を付けることができますが、名前の後に '()'括弧を追加することを忘れないでください。

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

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

私はあなたが求めていたdefine()機能に近づくようにグローバルメソッドを作ることができると思います、しかしあなたは本当にとにかく定数名をスコープし、グローバルを避けるべきです。

2
Daniel Skarbek

PHP 7以降

PHP 7以降では、 define() 関数を使用して定数配列を定義できます。

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

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

はい、配列を定数として定義できます。PHP 5.6以降から、定数をスカラ式として定義することができます。また、とすることも可能です。配列定数を定義することもできます。。定数をリソースとして定義することは可能ですが、予期しない結果を引き起こす可能性があるため、避けるべきです。

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

このリンクを参照して

幸せなコーディングをしてください。

1
Sahil Patel

あなたが2009年からこれを見ている、そしてあなたがAbstractSingletonFactoryGeneratorsを好まないならば、ここに他のいくつかのオプションがあります。

覚えておいてください、配列は割り当てられたとき、つまりこの場合は返されたときに "コピー"されるので、実際には毎回同じ配列になります。 (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

定数にはスカラー値しか含めることができません。配列のシリアル化(またはJSONエンコード表現)を格納することをお勧めします。

0
Alix Axel