Frage

In letzter Zeit der Gewohnheit, ich bin ganzzahlige Werte zu Konstanten der Zuordnung und einfach mit dem konstanten Namen als Mittel ihren Zweck zu identifizieren. In einigen Fällen jedoch ist dies in der Notwendigkeit ergibt eine Funktion wie typeToString ($ const), wenn eine String-Darstellung benötigt wird, um zu schreiben. Offensichtlich ist dies ineffizient und unneccesary, ist aber nur ein Problem jedes Mal eine Weile.

Also meine Frage ist, gibt es andere Nachteile sollte ich beachten? Welcher Fall gilt als saubere / mehr standardkonform sein? Außerdem ist der Unterschied in der Leistung negligable für die meisten Fälle?

Fall 1: (schneller, wenn eine String-Version ist nicht erforderlich)

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"

Fall 2: (schneller / einfacher, wenn eine String-Version ist erforderlich)

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"
War es hilfreich?

Lösung

Der Leistungsunterschied wird als vernachlässigbar, wenn Sie eine Menge von ihnen sind zu speichern. Ich würde die toString() Methode prägnante schreiben:

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

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

return $strings[$type];

Auch könnten Sie die $strings Array eine static machen.

Andere Tipps

ich ehrlich sein würde, ich weiß nicht, ob es eine Leistung ist „Hit“ jede Art, wenn Sie Ihre Konstanten nativ als Strings definieren - aber wenn es überhaupt eine ist, ich bin bereit zu wetten, dass es so klein ist, es wäre schwierig zu messen.

Persönlich, wenn der Wert der Konstante als wörtliche Bedeutung ist, dann weisen Sie einfach diesen Wert es. Wenn der Wert der konstanten nur als Option Selektor sinnvoll ist (oder ein anderer Hinweis von Wert), dann ganze Zahlen verwenden oder was auch immer Sie wählen, angemessen ist.

Ich denke, String-Konstanten die beste Wahl in diesem Fall ist. Code sieht besser aus.

Natürlich, wenn Sie letzte bisschen Leistung benötigen, Integer-Konstanten verwenden. Aber erst, nachdem Sie mit einem Profiler überprüfen, ob String-Vergleiche sind der Engpass. Wie auch immer, in den meisten Anwendungen gibt es viele teurer Dinge, wie der Datenbankzugriff etc.

Statt const ganze Zahlen verwendet ich in der Regel gehe nur mit Streichern, wenn ich sie zu drucken. Also würde ich so etwas wie $foo = new Foo('guest'); tun. Ich kann immer noch die Eingabe in den Konstruktor validieren und ich kann es markieren, wenn ich es brauche.

Im Beispiel schreiben Sie Sie alle Methoden fallen könnte und machen die Klasse statische und Sie würden Sie sich selbst ein Enumerator erstellt haben. Wie folgt aus:

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

Eine andere praktische Möglichkeit, Konstanten zu verwenden ist, sie als Anwendungskonfiguration zu verwenden. Sie sind viel schnelle Leistung klug dann eine XML-Datei zur Konfiguration Parsen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top