Это единственный способ иметь массивы как константы в php или это плохой код:
class MyClass { private static $myArray = array('test1','test2','test3'); public static function getMyArray() { return self::$myArray; } }
Ваш код в порядке: массивы не могут быть объявлены постоянными в PHP до версии 5.6, поэтому статический подход, вероятно, лучший способ. Вы должны подумать о том, чтобы пометить эту переменную как константу с помощью комментария:
/** @const */ private static $myArray = array(...);
С PHP 5.6.0 или новее вы можете объявить массивы постоянными:
const myArray = array(...);
Начиная с 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'));
Я наткнулся на эту тему, ища ответ сам. Подумав, я должен был бы передать свой массив через каждую функцию, в которой он был нужен. Мой опыт работы с массивами и mysql заставлял меня задаться вопросом, будет ли работать сериализация. Конечно.
define("MYARRAY", serialize($myarray)); function something() { $myarray= unserialize(MYARRAY); }
Пометить его статичным является хорошей альтернативой. Вот пример инкапсуляции статического массива, чтобы получить некоторое постоянное поведение.
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) }
Я предлагаю использовать следующее:
class MyClass { public static function getMyArray() { return array('test1','test2','test3'); } }
Таким образом, у вас есть массив const, и вам гарантировано, что никто не сможет его изменить, даже метод в самом классе.
Возможная микро-оптимизация (не уверен, сколько компиляторов PHP оптимизируется в наши дни):
class MyClass { public static function getMyArray() { static $myArray = array('test1','test2','test3'); return $myArray; } }
Вы создали статический массив, а не постоянный массив. Статические переменные изменяемы; константы неизменяемы. Ваш код неплохой, но он не делает того, что вы намереваетесь сделать.
В 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
.
Начиная с PHP 5.6, можно определить константу как скалярное выражение, а также определить константу массива.
class foo { const KEYS = [1, 3, 6, 7]; } // echo foo::KEYS[0]; // 1