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 MYCONSTANT
być ignorowany)
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"
(is_null(self::$staticVariable) === true) && (isset($value) === true)
byłoby o wiele bardziej zwięzłe, jak self::$staticVariable === null && $value !== null
. $value
zawsze będzie ustawione wewnątrz funkcji, więc nie ma potrzeby używania isset
. 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:
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
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, 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.
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();
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
lub protected
).
Obejściem byłoby zdefiniowanie stałych jako private
lub, protected
a 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