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í .

1200voto

NikiC Punkte 98746

Seit PHP 5.3 gibt es zwei Möglichkeiten, um Konstanten definieren : Entweder über die const oder mit dem Schlüsselwort define() Funktion:

const FOO = 'BAR';
define('FOO', 'BAR');

Der grundlegende Unterschied zwischen diesen beiden Möglichkeiten besteht darin, dass const definiert Konstanten zur Kompilierzeit, während define definiert sie während der Laufzeit. Dies bewirkt, dass die meisten const Nachteile. Einige Nachteile von const sind:

  • const kann nicht zur bedingten Definition von Konstanten verwendet werden. Um eine globale Konstante zu definieren, muss sie im äußersten Bereich verwendet werden:

     if (...) {
         const FOO = 'BAR';    // Invalid
     }
     // but
     if (...) {
         define('FOO', 'BAR'); // Valid
     }

    Warum sollten Sie das überhaupt tun wollen? Eine häufige Anwendung ist die Prüfung, ob die Konstante bereits definiert ist:

     if (!defined('FOO')) {
         define('FOO', 'BAR');
     }
  • const akzeptiert einen statischen Skalar (Zahl, String oder eine andere Konstante wie true , false , null , __FILE__ ), während define() nimmt einen beliebigen Ausdruck. Seit PHP 5.6 sind konstante Ausdrücke in const auch:

     const BIT_5 = 1 << 5;    // Valid since PHP 5.6 and invalid previously
     define('BIT_5', 1 << 5); // Always valid
  • const nimmt einen einfachen Konstantennamen, während define() akzeptiert einen beliebigen Ausdruck als Namen. Dies ermöglicht es, Dinge wie diese zu tun:

     for ($i = 0; $i < 32; ++$i) {
         define('BIT_' . $i, 1 << $i);
     }
  • const s wird immer zwischen Groß- und Kleinschreibung unterschieden, während define() ermöglicht die Definition von Konstanten ohne Berücksichtigung der Groß- und Kleinschreibung durch die Übergabe von true als drittes Argument (Hinweis: Die Definition von Konstanten, die Groß- und Kleinschreibung nicht berücksichtigen, ist seit PHP 7.3.0 veraltet und wurde mit PHP 8.0.0 entfernt):

     define('FOO', 'BAR', true);
     echo FOO; // BAR
     echo foo; // BAR

Das war also die schlechte Seite der Dinge. Sehen wir uns nun den Grund an, warum ich persönlich immer const es sei denn, eine der oben genannten Situationen tritt ein:

  • const liest sich einfach schöner. Es handelt sich um ein Sprachkonstrukt anstelle einer Funktion und ist außerdem konsistent mit der Definition von Konstanten in Klassen.

  • const ist ein Sprachkonstrukt und kann mit automatisierten Werkzeugen statisch analysiert werden.

  • const definiert eine Konstante im aktuellen Namespace, während define() muss der vollständige Namespace-Name übergeben werden:

     namespace A\B\C;
     // To define the constant A\B\C\FOO:
     const FOO = 'BAR';
     define('A\B\C\FOO', 'BAR');
  • Seit PHP 5.6 const Konstanten können auch Arrays sein, während define() unterstützt noch keine Arrays. In PHP 7 werden Arrays jedoch für beide Fälle unterstützt.

     const FOO = [1, 2, 3];    // Valid in PHP 5.6
     define('FOO', [1, 2, 3]); // Invalid in PHP 5.6 and valid in PHP 7.0

Schließlich ist zu beachten, dass const kann auch innerhalb einer Klasse oder Schnittstelle verwendet werden, um eine Klassenkonstante oder Schnittstellenkonstante. define können nicht zu diesem Zweck verwendet werden:

class Foo {
    const BAR = 2; // Valid
}
// But
class Baz {
    define('QUX', 2); // Invalid
}

Zusammenfassung

Wenn Sie keine Art von bedingter oder ausdrücklicher Definition benötigen, verwenden Sie const s anstelle von define() s - einfach aus Gründen der Lesbarkeit!

2 Stimmen

Wie ich weiß, werden Sie mit PHP 5.6 die Möglichkeit bekommen, einfache skalare Ausdrücke auch mit der const Sprachkonstrukt - siehe wiki.php.net/rfc/const_scalar_exprs

12 Stimmen

Ein weiterer Vorteil der Verwendung von const ist das Fehlen von Anführungszeichen, d. h. es wird dort, wo es in Ihrer IDE verwendet wird, gleich formatiert.

0 Stimmen

Ein weiterer Unterschied - Sie können nicht mit einem Wert von array definieren, während Sie mit const können Sie. So: define('C', []); wird nicht funktionieren, während const C = []; wird.

196voto

ryeguy Punkte 62987

Bis PHP 5.3, const konnte nicht im globalen Bereich verwendet werden. Sie können dies nur innerhalb einer Klasse verwenden. Dies sollte verwendet werden, wenn Sie eine konstante Option oder Einstellung festlegen wollen, die sich auf diese Klasse bezieht. Oder vielleicht wollen Sie eine Art Enum erstellen.

define kann für denselben Zweck verwendet werden, aber nur im globalen Bereich. Sie sollte nur für globale Einstellungen verwendet werden, die die gesamte Anwendung betreffen.

Ein Beispiel für gute const ist die Abschaffung der magischen Zahlen. Werfen Sie einen Blick auf PDOs Konstanten . Wenn Sie einen Abruftyp angeben müssen, würden Sie PDO::FETCH_ASSOC zum Beispiel. Würde man consts nicht verwenden, würde man am Ende so etwas eingeben wie 35 (oder was auch immer FETCH_ASSOC ist definiert als). Dies ergibt für den Leser keinen Sinn.

Ein Beispiel für gute define Verwendung ist vielleicht die Angabe des Root-Pfads Ihrer Anwendung oder der Versionsnummer einer Bibliothek.

13 Stimmen

Es sollte erwähnt werden, dass die Verwendung von const mit Namespaces.

32 Stimmen

Es sollte auch beachtet werden, dass PHP5.3 const im globalen Bereich sehr gut verwenden kann.

0 Stimmen

5.2 kann auch. Das Schöne an consts vs. defines ist, dass man ihnen den Klassennamen voranstellen muss. Die Verwendung von consts macht den Code lesbarer und hübscher. Und das ist ein Bonus für mich.

41voto

GordonM Punkte 30109

Ich weiß, dass diese Frage bereits beantwortet wurde, aber in keiner der aktuellen Antworten wird das Namespacing erwähnt und wie es sich auf Konstanten und Defines auswirkt.

Ab PHP 5.3 sind consts und defines in den meisten Punkten ähnlich. Es gibt jedoch noch einige wichtige Unterschiede:

  • Konstanten können nicht über einen Ausdruck definiert werden. const FOO = 4 * 3; funktioniert nicht, aber define('CONST', 4 * 3); tut.
  • Der Name, der an define muss den Namespace enthalten, der innerhalb dieses Namespaces definiert werden soll.

Der folgende Code soll die Unterschiede verdeutlichen.

namespace foo 
{
    const BAR = 1;
    define('BAZ', 2);
    define(__NAMESPACE__ . '\\BAZ', 3);
}

namespace {
    var_dump(get_defined_constants(true));
}

Der Inhalt des Benutzer-Subarrays wird sein ['foo\\BAR' => 1, 'BAZ' => 2, 'foo\\BAZ' => 3] .

\=== UPDATE ===

Das kommende PHP 5.6 wird ein wenig mehr Flexibilität mit const . Sie können nun Konstanten in Form von Ausdrücken definieren, vorausgesetzt, dass diese Ausdrücke aus anderen Konstanten oder aus Literalen bestehen. Das bedeutet, dass das Folgende ab 5.6. gültig sein sollte:

const FOOBAR = 'foo ' . 'bar';
const FORTY_TWO = 6 * 9; // For future editors: THIS IS DELIBERATE! Read the answer comments below for more details
const ULTIMATE_ANSWER = 'The ultimate answer to life, the universe and everything is ' . FORTY_TWO;

Sie können aber immer noch keine Konstanten in Form von Variablen oder Funktionsrückgaben definieren, also

const RND = mt_rand();
const CONSTVAR = $var;

wird immer noch nicht verfügbar sein.

9 Stimmen

Ich konnte mir die Frage nicht verkneifen: Haben Sie bewusst den Begriff FORTY_TWO als 54?

10 Stimmen

"Sechs mal neun? Zweiundvierzig? Ich habe immer gesagt, dass mit dem Universum etwas grundsätzlich nicht stimmt." Lesen Sie die Werke von Douglas Adams, wenn Sie eine umfassende Erklärung benötigen.

2 Stimmen

Ach so. Ich wusste, dass 42 die Antwort auf das Leben, das Universum und alles andere ist, aber ich hatte die Sechs-mal-Neun-Stelle übersehen. Danke für die Erklärung!

26voto

Jacob Relkin Punkte 156445

define Ich verwende für globale Konstanten.

const Ich verwende für Klassenkonstanten.

Sie können nicht define in den Geltungsbereich der Klasse, und mit const können Sie.

Außerdem, mit const wird er tatsächlich zu einem Mitglied der Klasse, und mit define wird sie in den globalen Bereich verschoben.

10 Stimmen

Wie bereits in anderen Antworten erwähnt, kann const in PHP 5.3+ auch außerhalb von Klassen verwendet werden

1 Stimmen

Nur das Schlüsselwort const kann verwendet werden, um eine Konstante mit Namensraum zu erstellen, nicht nur Klassen

22voto

mattle Punkte 329

Ich glaube, dass Sie ab PHP 5.3 die Option const außerhalb von Klassen, wie hier im zweiten Beispiel gezeigt:

http://www.php.net/manual/en/language.constants.syntax.php

<?php
// Works as of PHP 5.3.0
const CONSTANT = 'Hello World';

echo CONSTANT;
?>

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