777 Stimmen

PHP | define() vs. const

In PHP können Sie Konstanten auf zwei Arten deklarieren:

  1. Mit define Stichwort

    define('FOO', 1);
  2. Verwendung von const Stichwort

    const FOO = 1;

  • Was sind die Hauptunterschiede zwischen diesen beiden?
  • Wann und warum sollte man das eine und wann das andere verwenden?

12 Stimmen

Über Leistung (Zeitverschwendung mit Mikro-Optimierung wie ich), siehe diese Antwort : const ist zwei Mal schneller als define . Über die Ladezeit der Seite und die Speichernutzung: siehe diese Frage y dieser Artikel ... Siehe auch etwas über Opcode-Cache aquí .

20voto

slartibartfast Punkte 522

NikiC's Antwort ist die beste, aber lassen Sie mich eine nicht offensichtliche Warnung hinzufügen, wenn Namespaces verwenden, so dass Sie nicht mit unerwarteten Verhalten erwischt werden. Die Sache, die man sich merken sollte, ist, dass Defines つねに im globalen Namespace, es sei denn, Sie fügen den Namespace ausdrücklich als Teil des Define-Bezeichners hinzu. Was dabei nicht offensichtlich ist, ist, dass der Bezeichner des Namensraums den globalen Bezeichner übertrumpft. Also :

<?php
namespace foo
{
  // Note: when referenced in this file or namespace, the const masks the defined version
  // this may not be what you want/expect
  const BAR = 'cheers';
  define('BAR', 'wonka');

  printf("What kind of bar is a %s bar?\n", BAR);

  // To get to the define in the global namespace you need to explicitely reference it
  printf("What kind of bar is a %s bar?\n", \BAR);
}

namespace foo2
{
  // But now in another namespace (like in the default) the same syntax calls up the 
  // the defined version!
  printf("Willy %s\n", BAR);
  printf("three %s\n", \foo\BAR);  
}
?>

produziert:

What kind of bar is a cheers bar? 
What kind of bar is a wonka bar?
willy wonka 
three cheers

Was für mich den ganzen const-Begriff unnötig verwirrend macht, da die Idee einer const in Dutzenden von anderen Sprachen ist, dass es immer das gleiche ist, wo immer Sie in Ihrem Code sind, und PHP garantiert das nicht wirklich.

2 Stimmen

Ja, aber BAR y \foo\BAR sind nur no die gleichen Konstanten. Ich stimme zu, dass es wirklich verwirrend ist, aber wenn man auch Dinge wie die Namespacing-Logik berücksichtigt, die auf diese Weise konsistent ist, und dass weder const noch define() ist wie ein C Makro ( #define ), dann kann PHP eine Entschuldigung vorbringen.

3 Stimmen

Der Begriff der Konstante lautet genau wie es sich verhalten sollte - Sie befinden sich in einem Namespace! Wenn Sie die Konstante ohne den Namespace-Identifikator haben wollen, dann erstellen Sie sie außerhalb des Namespaces. Das macht es auch konsistent mit der const, die in einer Klasse definiert ist, auch wenn sie eine andere Syntax verwendet. Ja, define ist auch konsistent, allerdings auf eine andere Art.

16voto

AwesomeBobX64 Punkte 189

Die meisten dieser Antworten sind falsch oder erzählen nur die Hälfte der Geschichte.

  1. Sie können Ihre Konstanten mit Hilfe von Namespaces in den Geltungsbereich einbeziehen.
  2. Sie können das Schlüsselwort "const" auch außerhalb von Klassendefinitionen verwenden. Aber genau wie in Klassen müssen die mit dem Schlüsselwort "const" zugewiesenen Werte jedoch konstante Ausdrücke sein.

Zum Beispiel:

const AWESOME = 'Bob'; // Valid

Schlechtes Beispiel:

const AWESOME = whatIsMyName(); // Invalid (Function call)
const WEAKNESS = 4+5+6; // Invalid (Arithmetic) 
const FOO = BAR . OF . SOAP; // Invalid (Concatenation)

Um variable Konstanten zu erstellen, verwenden Sie define() wie folgt:

define('AWESOME', whatIsMyName()); // Valid
define('WEAKNESS', 4 + 5 + 6); // Valid
define('FOO', BAR . OF . SOAP); // Valid

2 Stimmen

PHP >=5.6 wurden einige Änderungen im Zend Engine Compiler vorgenommen und const wird nun auf eine andere Weise behandelt.

7voto

MrWhite Punkte 33983

Ja, const werden zur Kompilierzeit definiert und können als nikische Zustände nicht mit einem Ausdruck belegt werden, wie es define()'s können. Aber auch const's können nicht bedingt deklariert werden (aus demselben Grund), d.h. Sie können dies nicht tun:

if (/* some condition */) {
  const WHIZZ = true;  // CANNOT DO THIS!
}

Im Gegensatz dazu könnte man mit define(). Es kommt also nicht wirklich auf persönliche Vorlieben an, sondern es gibt eine richtige und eine falsche Art, beides zu verwenden.

Nebenbei bemerkt... Ich würde gerne eine Art Klassen-Konstante sehen, der ein Ausdruck zugewiesen werden kann, eine Art define(), die für Klassen isoliert werden kann?

7voto

Marcus Lind Punkte 9176

Um die Antwort von NikiC zu ergänzen. const kann innerhalb von Klassen auf folgende Weise verwendet werden:

class Foo {
    const BAR = 1;

    public function myMethod() {
        return self::BAR;
    }
}

Sie können dies nicht tun mit define() .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X