Как я могу определить константу внутри класса и сделать ее видимой только при вызове в контексте класса?
....что-то типа 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
В этом случае гулкого 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"
(is_null(self::$staticVariable) === true) && (isset($value) === true)
было бы намного лаконичнее self::$staticVariable === null && $value !== null
. $value
всегда будет устанавливаться внутри функции, поэтому использовать не нужно isset
. А гипер-явное === true
ничего не добавляет.
Это старый вопрос, но теперь в 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 {
const BAR = 'baz';
}
echo Foo::BAR;
Это единственный способ сделать классы константами . Эти константы всегда доступны глобально через Foo::BAR
, но не через просто BAR
.
Чтобы добиться такого синтаксиса Foo::baz()->BAR
, вам нужно будет вернуть объект из функции baz()
класса Foo
, у которого есть свойство BAR
. Однако это не всегда. Любая определяемая вами константа всегда доступна глобально из любого места и не может быть ограничена результатами вызова функции.
Это довольно старый вопрос, но, возможно, этот ответ еще может помочь кому-то другому.
Вы можете эмулировать общедоступную константу, которая ограничена в пределах области класса, применив ключевое слово final к методу, который возвращает предварительно определенное значение, например:
class Foo {
// This is a private constant
final public MYCONSTANT()
{
return 'MYCONSTANT_VALUE';
}
}
Ключевое слово final в методе предотвращает повторное определение метода расширяющимся классом. Вы также можете поместить ключевое слово 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