Як я можу визначити константу всередині класу і зробити так, щоб вона була видимою лише при виклику в контексті класу?
....щось на зразок 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
В цьому випадку гучного MYCONSTANT
сам по собі підніме повідомлення про невизначену константу і виводити постійне ім'я перетвореної в рядок: "MYCONSTANT"
.
EDIT - Можливо, те, що ви шукаєте, - це статичні властивості / змінні :
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
. Хоча це не постійно. Будь-яка константа, яку ви визначаєте, завжди є загальнодоступною з будь-якого місця і не може бути обмежена результатами викликів функцій.
Це досить давнє запитання, але, можливо, ця відповідь все ж може допомогти комусь іншому.
Ви можете емулювати публічну константу, яка обмежена в межах області класу, застосувавши ключове ключове слово до методу, який повертає заздалегідь визначене значення, наприклад:
class Foo {
// This is a private constant
final public MYCONSTANT()
{
return 'MYCONSTANT_VALUE';
}
}
Кінцеве ключове слово методу заважає розширюваному класу повторно визначити метод. Ви також можете розмістити остаточне ключове слово перед оголошенням класу, і в цьому випадку ключове слово перешкоджає успадкуванню класу.
Щоб отримати майже саме те, що шукав Алекс, можна використати такий код:
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