it-swarm.com.ru

PHP Константы, содержащие массивы?

Это не удалось:

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

Видимо, константы не могут содержать массивы. Каков наилучший способ обойти это?

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

//...

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

Это кажется ненужным усилием.

367
Nick Heiner

ПРИМЕЧАНИЕ: хотя это и является принятым ответом, стоит отметить, что в PHP 5.6+ у вас могут быть массивы const - см. Ответ Андреа Фолдса ниже .

Вы также можете сериализовать свой массив и затем поместить его в константу:

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

# use it
$my_fruits = unserialize (FRUITS);
480
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'));
731
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';

Если вам не нравится идея, что другие могут изменить массив, может помочь получатель:

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

ПРАВКА

Начиная с PHP5.4, можно даже получить доступ к значениям массива без необходимости использования промежуточных переменных, то есть работает следующее:

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

Если вы используете PHP 5.6 или выше, используйте ответ Андреа Фолдс

Я использую это так. Надеюсь, это поможет другим.

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

и различные элементы могут быть доступны так же, как и раньше. 

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

Я определил его, потому что мне нужно было хранить объекты и массивы в константах, поэтому я установил также runkit в php, чтобы я мог сделать переменную $ const суперглобальной.

Вы можете использовать его как $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] ;
}

Надеюсь, это поможет . Удачного кодирования.

2
MD. Sahib Bin Mahboob

Может даже работать с ассоциативными массивами .. например, в классе.

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

Делать какие-то трюки с «сер/дезер» или «кодировать/декодировать» кажется уродливым и требовать, чтобы вы помнили, что именно вы сделали, когда пытаетесь использовать константу. Я думаю, что приватная статическая переменная класса с аксессором - неплохое решение, но я сделаю вам лучше. Просто используйте публичный статический метод получения, который возвращает определение константного массива. Это требует минимум дополнительного кода и определение массива не может быть случайно изменено.

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