PHP - Konstante innerhalb einer Klasse definieren

86

Wie kann ich eine Konstante innerhalb einer Klasse definieren und so gestalten, dass sie nur sichtbar ist, wenn sie in einem Klassenkontext aufgerufen wird?

....etwas wie Foo::app()->MYCONSTANT;

(und wenn aufgerufen, gerne MYCONSTANTignoriert werden)

Alex
quelle
3
Ich hatte dieses Problem vor kurzem stackoverflow.com/q/5710676/560299
Ibu

Antworten:

136

Siehe Klassenkonstanten :

class MyClass
{
    const MYCONSTANT = 'constant value';

    function showConstant() {
        echo  self::MYCONSTANT. "\n";
    }
}

echo MyClass::MYCONSTANT. "\n";

$classname = "MyClass";
echo $classname::MYCONSTANT. "\n"; // As of PHP 5.3.0

$class = new MyClass();
$class->showConstant();

echo $class::MYCONSTANT."\n"; // As of PHP 5.3.0

In diesem Fall Echo MYCONSTANTvon selbst würde eine Mitteilung über einen nicht definierten Konstante und gibt die erhöht konstante Namen in einen String umgewandelt: "MYCONSTANT".


BEARBEITEN - Vielleicht suchen Sie nach diesen statischen Eigenschaften / Variablen :

class MyClass
{
    private static $staticVariable = null;

    public static function showStaticVariable($value = null)
    {
        if ((is_null(self::$staticVariable) === true) && (isset($value) === true))
        {
            self::$staticVariable = $value;
        }

        return self::$staticVariable;
    }
}

MyClass::showStaticVariable(); // null
MyClass::showStaticVariable('constant value'); // "constant value"
MyClass::showStaticVariable('other constant value?'); // "constant value"
MyClass::showStaticVariable(); // "constant value"
Alix Axel
quelle
aber es funktioniert nicht, es innerhalb einer Funktion der Klasse zu definieren :(
Alex
@Alex: Nein, tut es nicht (AFAIK, es könnte einen dunklen Weg geben).
Alix Axel
2
(is_null(self::$staticVariable) === true) && (isset($value) === true)wäre viel prägnanter als self::$staticVariable === null && $value !== null. $valuewird immer gesetzt innerhalb der Funktion, so verwenden keine Notwendigkeit isset. Und das Hyper-Explizite === truefügt nichts hinzu.
Täuschung
1
Hatten wir dieses Gespräch schon einmal? Kann nicht anders, ich mag diesen Stil einfach nicht. ;-D
Täuschung
@deceze: Ja. Ich bin sehr an diesen Stil gewöhnt und er funktioniert für mich, also bleibe ich dabei, aber du hast auch Recht. =)
Alix Axel
22

Dies ist eine alte Frage, aber jetzt können Sie unter PHP 7.1 eine konstante Sichtbarkeit definieren.

BEISPIEL

<?php
class Foo {
    // As of PHP 7.1.0
    public const BAR = 'bar';
    private const BAZ = 'baz';
}
echo Foo::BAR . PHP_EOL;
echo Foo::BAZ . PHP_EOL;
?>

Ausgabe des obigen Beispiels in PHP 7.1:

Bar

Schwerwiegender Fehler: Nicht gefangener Fehler: Kein Zugriff auf private const Foo :: BAZ in…

Hinweis: Ab PHP 7.1.0 sind Sichtbarkeitsmodifikatoren für Klassenkonstanten zulässig.

Mehr Infos hier

matiaslauriti
quelle
11
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

Dies ist die einzige Möglichkeit, Klassenkonstanten zu erstellen . Diese Konstanten sind immer global über zugänglich Foo::BAR, aber nicht nur über BAR.

Um eine Syntax wie zu erreichen Foo::baz()->BAR, müssten Sie ein Objekt aus der Funktion baz()einer Klasse Foomit einer Eigenschaft zurückgeben BAR . Das ist aber keine Konstante. Jede von Ihnen definierte Konstante ist immer global von überall zugänglich und kann nicht auf Ergebnisse von Funktionsaufrufen beschränkt werden.

täuschen
quelle
6

Dies ist eine ziemlich alte Frage, aber vielleicht kann diese Antwort noch jemand anderem helfen.

Sie können eine öffentliche Konstante emulieren, die innerhalb eines Klassenbereichs eingeschränkt ist, indem Sie das Schlüsselwort final auf eine Methode anwenden, die einen vordefinierten Wert zurückgibt, wie folgt:

class Foo {

    // This is a private constant
    final public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

Das letzte Schlüsselwort für eine Methode verhindert, dass eine erweiterte Klasse die Methode neu definiert. Sie können das letzte Schlüsselwort auch vor die Klassendeklaration stellen. In diesem Fall verhindert das Schlüsselwort die Klassenvererbung.

Um fast genau das zu bekommen, wonach Alex gesucht hat, kann der folgende Code verwendet werden:

final class Constants {

    public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

class Foo {

    static public app()
    {
        return new Constants();
    }
}

Der emulierte konstante Wert wäre folgendermaßen zugänglich:

Foo::app()->MYCONSTANT();
Wouter van Dam
quelle
3

Sie können eine Klassenkonstante in PHP definieren. Auf Ihre Klassenkonstante kann aber auch von jeder Objektinstanz aus zugegriffen werden. Dies ist die Funktionalität von PHP. Doch ab php7.1 , können Sie Ihre Klasse Konstanten mit definieren Zugriffsmodifikatoren ( public, privateoder protected).

Eine Problemumgehung wäre, Ihre Konstante als privateoder zu definieren protectedund sie dann über a lesbar zu machen static function. Diese Funktion sollte die konstanten Werte nur zurückgeben, wenn sie aus dem statischen Kontext aufgerufen wird.

Sie können diese statische Funktion auch in Ihrer übergeordneten Klasse erstellen und diese übergeordnete Klasse einfach für alle anderen Klassen erben, um sie zu einer Standardfunktionalität zu machen.

Credits: http://dwellupper.io/post/48/defining-class-constants-in-php

Pranav Rana
quelle