PHP-константы: преимущества / недостатки - PullRequest
7 голосов
/ 29 октября 2008

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

Ответы [ 5 ]

8 голосов
/ 29 октября 2008

Разница в производительности будет незначительной, если вы не храните их много. Я бы написал toString() метод более кратко:

$strings = array
(
    self::USER_TYPE_ADMIN => 'admin',
    self::USER_TYPE_USER => 'user',
);

if (!isset($strings[$type]))
    return 'unknown';

return $strings[$type];

Кроме того, вы можете сделать массив $strings static.

4 голосов
/ 29 октября 2008

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

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

1 голос
/ 29 октября 2008

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

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

0 голосов
/ 30 октября 2008

В примере, который вы пишете, вы можете отбросить все методы и сделать класс статическим, и вы бы сами создали Enumerator. Как это:

class Enumeration{
  public static const One=1;
  public static const Two=2;
  public static const Three=3;
}

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

0 голосов
/ 29 октября 2008

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

...