classMyClass{
const MYCONSTANT = 'constant value';
functionshowConstant() {
echoself::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".
но определить его внутри функции класса не получается :(
Alex
@Alex: Нет (AFAIK, может быть какой-то неясный способ).
Аликс Аксель
3
(is_null(self::$staticVariable) === true) && (isset($value) === true)было бы намного лаконичнее self::$staticVariable === null && $value !== null. $valueвсегда будет устанавливаться внутри функции, поэтому использовать не нужно isset. А гипер-явное === trueничего не добавляет.
deceze
1
У нас был этот разговор раньше? Ничего не могу поделать, мне просто очень не нравится этот стиль. ;-D
deceze
@deceze: Да. Я очень привык к этому стилю, и он мне подходит, поэтому я буду его придерживаться, но ты тоже прав. =)
Аликс Аксель
24
Это старый вопрос, но теперь в PHP 7.1 вы можете определить постоянную видимость.
ПРИМЕР
<?phpclassFoo{
// As of PHP 7.1.0publicconst BAR = 'bar';
privateconst BAZ = 'baz';
}
echo Foo::BAR . PHP_EOL;
echo Foo::BAZ . PHP_EOL;
?>
Вывод приведенного выше примера в PHP 7.1:
бар
Неустранимая ошибка: Неперехваченная ошибка: Невозможно получить доступ к закрытому const Foo :: BAZ в…
Примечание.
Начиная с версии PHP 7.1.0 для констант класса разрешены модификаторы видимости.
Это единственный способ сделать классы константами . Эти константы всегда доступны глобально через Foo::BAR, но не через просто BAR.
Чтобы добиться такого синтаксиса Foo::baz()->BAR, вам нужно будет вернуть объект из функции baz()класса Foo, у которого есть свойствоBAR . Однако это не всегда. Любая определяемая вами константа всегда доступна глобально из любого места и не может быть ограничена результатами вызова функции.
Это довольно старый вопрос, но, возможно, этот ответ еще может помочь кому-то другому.
Вы можете эмулировать общедоступную константу, которая ограничена в пределах области класса, применив ключевое слово final к методу, который возвращает предварительно определенное значение, например:
classFoo{
// This is a private constantfinalpublic MYCONSTANT()
{
return'MYCONSTANT_VALUE';
}
}
Ключевое слово final в методе предотвращает повторное определение метода расширяющимся классом. Вы также можете поместить ключевое слово final перед объявлением класса, и в этом случае ключевое слово предотвращает наследование класса.
Чтобы получить почти именно то, что искал Алекс, можно использовать следующий код:
Вы можете определить константу класса в php. Но ваша константа класса также будет доступна из любого экземпляра объекта. Это функциональность php. Тем не менее, по состоянию на php7.1 , вы можете определить константы класса с модификаторами доступа ( public, privateилиprotected ).
Чтобы обойти эту проблему, нужно определить вашу константу как privateили, protectedа затем сделать их читаемыми с помощью файла static function. Эта функция должна возвращать постоянные значения, только если вызывается из статического контекста.
Вы также можете создать эту статическую функцию в своем родительском классе и просто унаследовать этот родительский класс от всех других классов, чтобы сделать ее функцией по умолчанию.
Ответы:
См. Константы класса :
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:
Больше информации здесь
источник
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(); } }
Эмулированное постоянное значение будет доступно следующим образом:
источник
Вы можете определить константу класса в php. Но ваша константа класса также будет доступна из любого экземпляра объекта. Это функциональность php. Тем не менее, по состоянию на php7.1 , вы можете определить константы класса с модификаторами доступа (
public
,private
илиprotected
).Чтобы обойти эту проблему, нужно определить вашу константу как
private
или,protected
а затем сделать их читаемыми с помощью файлаstatic function
. Эта функция должна возвращать постоянные значения, только если вызывается из статического контекста.Вы также можете создать эту статическую функцию в своем родительском классе и просто унаследовать этот родительский класс от всех других классов, чтобы сделать ее функцией по умолчанию.
Кредиты: http://dwellupper.io/post/48/defining-class-constants-in-php
источник