PHP - zdefiniuj stałą wewnątrz klasy

88

Jak zdefiniować stałą w klasie i sprawić, by była widoczna tylko wtedy, gdy zostanie wywołana w kontekście klasy?

....coś jak Foo::app()->MYCONSTANT;

(a jeśli zostanie wezwany, lubi MYCONSTANTbyć ignorowany)

Alex
źródło
3
Ostatnio miałem ten problem stackoverflow.com/q/5710676/560299
Ibu

Odpowiedzi:

140

Zobacz stałe klasy :

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

W tym przypadku echem MYCONSTANTsam podniesie zawiadomienie o nieokreślonej stałej i wysyłać stała nazwa zamienione na ciąg: "MYCONSTANT".


EDYCJA - Być może to, czego szukasz, to statyczne właściwości / zmienne :

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
źródło
ale nie działa zdefiniowanie tego w funkcji klasy :(
Alex
@Alex: Nie, nie (AFAIK, może być jakiś niejasny sposób).
Alix Axel
3
(is_null(self::$staticVariable) === true) && (isset($value) === true)byłoby o wiele bardziej zwięzłe, jak self::$staticVariable === null && $value !== null. $valuezawsze będzie ustawione wewnątrz funkcji, więc nie ma potrzeby używania isset. A hiper-jawne === truenic nie dodaje.
deceze
1
Czy rozmawialiśmy wcześniej? Nic na to nie poradzę, po prostu naprawdę nie lubię tego stylu. ;-D
deceze
@ deceze: Tak. Jestem bardzo przyzwyczajony do tego stylu i na mnie działa, więc będę się go trzymać, ale ty też masz rację. =)
Alix Axel
24

To jest stare pytanie, ale teraz w PHP 7.1 możesz zdefiniować stałą widoczność.

PRZYKŁAD

<?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;
?>

Wynik powyższego przykładu w PHP 7.1:

bar

Błąd krytyczny: nieprzechwycony błąd: nie można uzyskać dostępu do prywatnej stałej Foo :: BAZ w…

Uwaga: Od PHP 7.1.0 modyfikatory widoczności są dozwolone dla stałych klas.

Więcej informacji tutaj

matiaslauriti
źródło
11
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

Jest to jedyny sposób tworzenia stałych klas . Te stałe są zawsze dostępne globalnie przez Foo::BAR, ale nie są dostępne tylko przez BAR.

Aby uzyskać taką składnię Foo::baz()->BAR, należałoby zwrócić obiekt z funkcji baz()klasy, Fooktóra ma właściwość BAR . Nie jest to jednak stała. Każda zdefiniowana stała jest zawsze globalnie dostępna z dowolnego miejsca i nie może być ograniczona do wyników wywołań funkcji.

zamrozić
źródło
6

To dość stare pytanie, ale być może ta odpowiedź może pomóc komuś innemu.

Możesz emulować stałą publiczną, która jest ograniczona w zakresie klasy, stosując końcowe słowo kluczowe do metody, która zwraca wstępnie zdefiniowaną wartość, na przykład:

class Foo {

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

Ostatnie słowo kluczowe w metodzie zapobiega ponownej definicji metody przez klasę rozszerzającą. Możesz również umieścić końcowe słowo kluczowe przed deklaracją klasy, w którym to przypadku słowo kluczowe zapobiega dziedziczeniu klas.

Aby uzyskać prawie dokładnie to, czego szukał Alex, można użyć następującego kodu:

final class Constants {

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

class Foo {

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

Emulowana stała byłaby dostępna w następujący sposób:

Foo::app()->MYCONSTANT();
Wouter van Dam
źródło
3

Możesz zdefiniować stałą klasy w php. Ale twoja stała klasy byłaby również dostępna z dowolnej instancji obiektu. To jest funkcjonalność php. Jednak od php7.1 , można zdefiniować klasę stałych z modyfikatorów dostępu ( public, privatelub protected).

Obejściem byłoby zdefiniowanie stałych jako privatelub, protecteda następnie uczynienie ich czytelnymi za pomocą pliku static function. Ta funkcja powinna zwracać wartości stałe tylko wtedy, gdy jest wywoływana z kontekstu statycznego.

Możesz również utworzyć tę funkcję statyczną w swojej klasie nadrzędnej i po prostu odziedziczyć tę klasę nadrzędną po wszystkich innych klasach, aby stała się funkcją domyślną.

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

Pranav Rana
źródło