Подтвердить что ты не робот

Массивы php const

Это единственный способ иметь массивы в качестве констант в php или это плохой код:

class MyClass
{
    private static $myArray = array('test1','test2','test3');

    public static function getMyArray()
    {
       return self::$myArray;
    } 
}
4b9b3361

Ответ 1

Ваш код в порядке: массивы не могут быть объявлены постоянными в PHP до версии 5.6, поэтому статический подход, вероятно, лучший способ. Вы должны подумать о том, чтобы пометить эту переменную как константу через комментарий:

/** @const */
private static $myArray = array(...);

С PHP 5.6.0 или новее вы можете объявить массивы постоянными:

const myArray = array(...);

Ответ 2

Начиная с PHP 5.6.0 (28 августа 2014 г.), можно определить константу массива (см. PHP 5.6.0 новые функции).

class MyClass
{
    const MYARRAY = array('test1','test2','test3');

    public static function getMyArray()
    {
        /* use `self` to access class constants from inside the class definition. */
        return self::MYARRAY;
    } 
}

/* use the class name to access class constants from outside the class definition. */
echo MyClass::MYARRAY[0]; // echo 'test1'
echo MyClass::getMyArray()[1]; // echo 'test2'

$my = new MyClass();
echo $my->getMyArray()[2]; // echo 'test3'

С PHP 7.0.0 (03 Dec 2015) константы массива могут быть определены с помощью define(). В PHP 5.6 они могут быть определены только с помощью const. (См. Новые возможности PHP 7.0.0)

define('MYARRAY', array('test1','test2','test3'));

Ответ 3

Я наткнулся на эту тему, ища ответ сам. Подумав, я должен был бы передать свой массив через каждую функцию, в которой он был нужен. Мой опыт работы с массивами и mysql заставлял меня задаться вопросом, будет ли работать сериализация. Конечно, это так.

define("MYARRAY",     serialize($myarray));

function something() {
    $myarray= unserialize(MYARRAY);
}

Ответ 4

Маркировка статической является хорошей альтернативой. Здесь пример инкапсуляции статического массива, чтобы получить поведение константа.

class ArrayConstantExample {

    private static $consts = array(
        'CONST_MY_ARRAY' => array(
            1,2,3,4
        )
    );

    public static function constant($name) {
        return self::$consts[$name];
    }

}

var_dump( ArrayConstantExample::constant('CONST_MY_ARRAY') );

Печать

array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) }

Ответ 5

Я предлагаю использовать следующее:

class MyClass
{
    public static function getMyArray()
    {
       return array('test1','test2','test3');
    } 
}

Таким образом, у вас есть массив констант, и вам гарантировано, что никто не сможет его изменить, даже метод в самом классе.

Возможная микро-оптимизация (не уверен, насколько оптимизированы компиляторы PHP в настоящее время):

class MyClass
{
    public static function getMyArray()
    {
       static $myArray = array('test1','test2','test3');
       return $myArray;
    } 
}

Ответ 6

Вы создали статический массив, не постоянный массив. Статические переменные изменяемы; константы неизменяемы. Ваш код неплохой, но он не делает того, что вы намереваетесь сделать.

В PHP 5.6 вы можете объявить массивы const. См. мои предыдущие объяснения.

Возможно, вы хотите что-то вроде этого:

class MyClass
{
    const MY_ARRAY = array('test1','test2','test3');

    public function getMyArray()
    {
       return MY_ARRAY;
    } 
}

Обратите внимание, что константы не имеют префикса $, что указывает на их неизменность. $foo - переменная; FOO нет. Кроме того, постоянные имена всегда капитализируются, по крайней мере, на языках программирования, которым я подвергался. Это не выполняется компилятором; это просто (почти?) универсальный стиль кодирования. Ключевые слова видимости public, protected и private не применяются к константам. Наконец, static может применяться или может применяться в зависимости от того, хотите ли вы, чтобы функция была static.

Ответ 7

Начиная с PHP 5.6, можно определить константу как скалярное выражение, а также определить константу массива.

class foo {
   const KEYS = [1, 3, 6, 7];
}
//
echo foo::KEYS[0]; // 1