Константы PHP: преимущества / недостатки

В последнее время я имел обыкновение присваивать константам целочисленные значения и просто использовать имя константы как средство определения ее цели. Однако в некоторых случаях это приводило к необходимости писать такую ​​функцию, как 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"

Я запутался - вы хотели изменить 0, 1, 2 на «admin», «user», «guest» в случае 2?

Greg 29.10.2008 21:46

Да, конечно же! :-) Спасибо, что заметили, сейчас его нужно обновить.

Wilco 29.10.2008 21:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
2
7 288
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вместо использования целых чисел типа const я обычно использую строки, если мне нужно их распечатать. Я бы сделал что-нибудь вроде $foo = new Foo('guest');. Я все еще могу проверить ввод в конструкторе и пометить его, когда мне это нужно.

Я бы тоже так поступил, но OP, похоже, пришел из более строгого фона ... возможно, бывший программист на C++ или Java: p

Greg 29.10.2008 21:53

В настоящее время я разработчик на C++ и даже использую там строки в общем случае.

Jasper Bekkers 29.10.2008 23:10

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

Лично, если значение константы имеет смысл как литерал, просто присвойте ей это значение. Если значение константы имеет смысл только как селектор опций (или какое-либо другое значение индикация), тогда используйте целые числа или все, что вы выберете подходящим.

Сравнение строк дороже, чем сравнение целых чисел.

Paweł Hajdan 29.10.2008 21:49

Но разница между 10 сравнениями строк и 10 целочисленными сравнениями настолько мала, что, если это упрощает кодирование, лучше использовать строки.

Greg 29.10.2008 21:51

Ya phjr, но использование целых чисел, когда вы действительно хотите, чтобы строки просто сокращали миллисекунды миллисекунд на каждом запросе, просто абсолютно REEKS предварительной оптимизации.

Peter Bailey 29.10.2008 22:00

Я думаю, что строковые константы - лучший выбор в этом случае. Код выглядит лучше.

Конечно, если вам нужен последний бит производительности, используйте целочисленные константы. Но только после того, как вы проверите с помощью профилировщика, что сравнение строк является узким местом. В любом случае, в большинстве приложений есть много более дорогих вещей, например, доступ к базе данных и т. д.

Ответ принят как подходящий

Разница в производительности будет незначительной, если вы не храните их много. Я бы написал метод 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 не позволяет использовать "общедоступные статические" ключевые слова для констант. Ваш код сгенерирует синтаксическую ошибку.

user254518 20.01.2010 04:24

Другие вопросы по теме