Как определить константу внутри класса и сделать ее видимой только при вызове в контексте класса?
.... что-то вроде Foo::app()->MYCONSTANT;
(и если вызывается как MYCONSTANT
для игнорирования)
Как определить константу внутри класса и сделать ее видимой только при вызове в контексте класса?
.... что-то вроде Foo::app()->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
В этом случае echoing MYCONSTANT
само по себе увеличит уведомление о константе undefined и выведет имя константы, преобразованное в строку: "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:
bar Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
Примечание:Начиная с PHP 7.1.0 модификаторы видимости допускаются для констант класса.
Подробнее здесь
Это довольно старый вопрос, но, возможно, этот ответ может помочь кому-то другому.
Вы можете эмулировать общедоступную константу, которая ограничена в пределах класса, применяя последнее ключевое слово к методу, который возвращает заданное значение, например:
class Foo {
// This is a private constant
final public MYCONSTANT()
{
return 'MYCONSTANT_VALUE';
}
}
Конечное ключевое слово в методе предотвращает повторный определение метода расширения. Вы также можете поместить ключевое слово final перед объявлением класса, и в этом случае ключевое слово предотвращает наследование класса.
Чтобы получить почти то, что Алекс искал, можно использовать следующий код:
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