В последнее время я имел обыкновение присваивать константам целочисленные значения и просто использовать имя константы как средство определения ее цели. Однако в некоторых случаях это приводило к необходимости писать такую функцию, как typeToString ($ const), когда требуется строковое представление. Очевидно, это неэффективно и излишне, но время от времени возникает проблема.
Итак, мой вопрос: есть ли другие компромиссы, которые мне следует рассмотреть? Какой корпус считается более чистым / более соответствующим стандартам? Кроме того, в большинстве случаев разница в производительности незначительна?
Случай 1: (быстрее, когда строковая версия не нужна?)
class Foo {
const USER_TYPE_ADMIN = 0;
const USER_TYPE_USER = 1;
const USER_TYPE_GUEST = 2;
public $userType = self::USER_TYPE_ADMIN;
public function __construct($type) {
$this->userType = $type;
}
public function typeToString() {
switch($this->userType) {
case self::USER_TYPE_ADMIN:
return 'admin';
break;
case self::USER_TYPE_USER:
return 'user';
break;
case self::USER_TYPE_GUEST:
return 'guest';
break;
default:
return 'unknown';
break;
}
}
}
$foo = new Foo(Foo::USER_TYPE_GUEST);
echo $foo->typeToString();
// Displays "guest"
Случай 2: (быстрее / проще, если требуется строковая версия)
class Foo {
const USER_TYPE_ADMIN = 'admin';
const USER_TYPE_USER = 'user';
const USER_TYPE_GUEST = 'guest';
public $userType = self::USER_TYPE_ADMIN;
public function __construct($type) {
$this->userType = $type;
}
}
$foo = new Foo(Foo::USER_TYPE_GUEST);
echo $foo->userType();
// Displays "guest"
Да, конечно же! :-) Спасибо, что заметили, сейчас его нужно обновить.






Вместо использования целых чисел типа const я обычно использую строки, если мне нужно их распечатать. Я бы сделал что-нибудь вроде $foo = new Foo('guest');. Я все еще могу проверить ввод в конструкторе и пометить его, когда мне это нужно.
Я бы тоже так поступил, но OP, похоже, пришел из более строгого фона ... возможно, бывший программист на C++ или Java: p
В настоящее время я разработчик на C++ и даже использую там строки в общем случае.
Я буду честен, я не знаю, есть ли какой-либо «удар» по производительности, когда вы изначально определяете свои константы как строки - но если он вообще есть, я готов поспорить, что он настолько мал, что он будет трудно измерить.
Лично, если значение константы имеет смысл как литерал, просто присвойте ей это значение. Если значение константы имеет смысл только как селектор опций (или какое-либо другое значение индикация), тогда используйте целые числа или все, что вы выберете подходящим.
Сравнение строк дороже, чем сравнение целых чисел.
Но разница между 10 сравнениями строк и 10 целочисленными сравнениями настолько мала, что, если это упрощает кодирование, лучше использовать строки.
Ya phjr, но использование целых чисел, когда вы действительно хотите, чтобы строки просто сокращали миллисекунды миллисекунд на каждом запросе, просто абсолютно REEKS предварительной оптимизации.
Я думаю, что строковые константы - лучший выбор в этом случае. Код выглядит лучше.
Конечно, если вам нужен последний бит производительности, используйте целочисленные константы. Но только после того, как вы проверите с помощью профилировщика, что сравнение строк является узким местом. В любом случае, в большинстве приложений есть много более дорогих вещей, например, доступ к базе данных и т. д.
Разница в производительности будет незначительной, если вы не храните их много.
Я бы написал метод toString() более кратко:
$strings = array
(
self::USER_TYPE_ADMIN => 'admin',
self::USER_TYPE_USER => 'user',
);
if (!isset($strings[$type]))
return 'unknown';
return $strings[$type];
Кроме того, вы можете сделать массив $stringsstatic.
В примере, который вы пишете, вы могли бы отбросить все методы и сделать класс статическим, и вы бы сами создали Enumerator. Нравится:
class Enumeration{
public static const One=1;
public static const Two=2;
public static const Three=3;
}
Еще один удобный способ использования констант - использовать их в качестве конфигурации приложения. Они намного быстрее с точки зрения производительности, чем анализ XML-файла для настройки.
Никола, php не позволяет использовать "общедоступные статические" ключевые слова для констант. Ваш код сгенерирует синтаксическую ошибку.
Я запутался - вы хотели изменить 0, 1, 2 на «admin», «user», «guest» в случае 2?