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
<?phpclassFoo{
// As of PHP 7.1.0publicconst BAR = 'bar';
privateconst 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.
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.
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:
classFoo{
// This is a private constantfinalpublic 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:
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ą.
Odpowiedzi:
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
MYCONSTANT
sam 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"
źródło
(is_null(self::$staticVariable) === true) && (isset($value) === true)
byłoby o wiele bardziej zwięzłe, jakself::$staticVariable === null && $value !== null
.$value
zawsze będzie ustawione wewnątrz funkcji, więc nie ma potrzeby używaniaisset
. A hiper-jawne=== true
nic nie dodaje.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:
Więcej informacji tutaj
źródło
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 przezBAR
.Aby uzyskać taką składnię
Foo::baz()->BAR
, należałoby zwrócić obiekt z funkcjibaz()
klasy,Foo
któ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.źródło
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:
źródło
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
,private
lubprotected
).Obejściem byłoby zdefiniowanie stałych jako
private
lub,protected
a następnie uczynienie ich czytelnymi za pomocą plikustatic 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
źródło