Как определить константу внутри класса и сделать так, чтобы она была видна только при вызове в контексте класса?
…. что-то вроде Foo::app()->MYCONSTANT;
(и если вы MYCONSTANT
чтобы MYCONSTANT
был проигнорирован)
См. Константы класса :
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
В этом случае эхо MYCONSTANT
само по себе поднимет уведомление о неопределенной константе и "MYCONSTANT"
имя константы, преобразованное в строку: "MYCONSTANT"
.
РЕДАКТИРОВАТЬ. Возможно, именно то, что вы ищете, это статические свойства / переменные :
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"
class Foo { const BAR = 'baz'; } echo Foo::BAR;
Это единственный способ сделать классовые константы . Эти константы всегда доступны по всему миру через Foo::BAR
, но они недоступны только через BAR
.
Чтобы получить такой синтаксис, как Foo::baz()->BAR
, вам нужно будет вернуть объект из функции baz()
класса Foo
которая имеет свойство BAR
. Однако это не константа. Любая константа, которую вы определяете, всегда доступна по всему миру из любого места и не может быть ограничена результатами вызова функции.
Это и старый вопрос, но теперь на PHP 7.1 вы можете определить постоянную видимость.
ПРИМЕР
<?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; ?>
Вывод приведенного выше примера в PHP 7.1:
бар Неустранимая ошибка: нечистая ошибка: не удается получить доступ к закрытому const Foo :: BAZ в ...
Примечание. Начиная с PHP 7.1.0 модификаторы видимости допускаются для констант класса.
Больше информации здесь
Это довольно старый вопрос, но, возможно, этот ответ может помочь кому-то другому.
Вы можете эмулировать публичную константу, которая ограничена в пределах класса, применяя последнее ключевое слово к методу, который возвращает заданное значение, например:
class Foo { // This is a private constant final public MYCONSTANT() { return 'MYCONSTANT_VALUE'; } }
Последнее ключевое слово для метода предотвращает повторный определение метода расширения. Вы также можете поместить ключевое слово final перед объявлением класса, и в этом случае ключевое слово предотвращает класс Inheritance.
Чтобы получить почти то, что Алекс искал, можно использовать следующий код:
final class Constants { public MYCONSTANT() { return 'MYCONSTANT_VALUE'; } } class Foo { static public app() { return new Constants(); } }
Эмулированное постоянное значение будет доступно следующим образом:
Foo::app()->MYCONSTANT();
Вы можете определить константу класса в php. Но ваша константа класса была бы доступна и из любого экземпляра объекта. Это функциональность php. Однако с php7.1 вы можете определить свои константы класса с помощью модификаторов доступа ( public
, private
или protected
).
Работа будет заключаться в том, чтобы определить вашу константу как private
или protected
а затем сделать ее читаемой через static function
. Эта функция должна возвращать константные значения только при вызове из статического контекста.
Вы также можете создать эту статическую функцию в своем родительском классе и просто наследовать этот родительский класс на всех других классах, чтобы сделать его по умолчанию.
Кредиты: http://dwellupper.io/post/48/defining-class-constants-in-php