Это единственный способ иметь массивы в качестве констант в php или это плохой код:
class MyClass
{
private static $myArray = array('test1','test2','test3');
public static function getMyArray()
{
return self::$myArray;
}
}
Это единственный способ иметь массивы в качестве констант в 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');
}
}
Таким образом, у вас есть массив констант, и вам гарантировано, что никто не сможет его изменить, даже метод в самом классе.
Возможная микро-оптимизация (не уверен, насколько оптимизированы компиляторы 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