PHP - визначає константу всередині класу


88

Як я можу визначити константу всередині класу і зробити так, щоб вона була видимою лише при виклику в контексті класу?

....щось на зразок Foo::app()->MYCONSTANT;

(і якщо його закликають, як MYCONSTANTігнорувати)


3
у мене ця проблема була нещодавно stackoverflow.com/q/5710676/560299
Ібу,

Відповіді:


140

Див. Константи класу :

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"

але це не працює, щоб визначити це всередині функції класу :(
Олексій

@Alex: Ні, ні (AFAIK, можливо, є якийсь незрозумілий спосіб).
Алікс Аксель

3
(is_null(self::$staticVariable) === true) && (isset($value) === true)було б набагато лаконічнішим як self::$staticVariable === null && $value !== null. $valueзавжди буде встановлено всередині функції, тому не потрібно використовувати isset. А гіпервиразний текст === trueнічого не додає.
обдурити

1
У нас була ця розмова раніше? Не можу втриматися, мені просто дуже не подобається такий стиль. ;-D
обдурити

@deceze: Так. Я дуже звик до цього стилю, і він працює для мене, тому я буду дотримуватися його, але ти теж маєш рацію. =)
Алікс Аксель

24

Це старе запитання, але тепер на 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 модифікатори видимості допускаються для констант класу.

Більше інформації тут


11
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

Це єдиний спосіб зробити константи класу . Ці константи завжди доступні у всьому світі через Foo::BAR, але вони не доступні лише через BAR.

Щоб отримати такий синтаксис Foo::baz()->BAR, вам потрібно буде повернути об'єкт із функції baz()класу, Fooщо має властивість BAR . Хоча це не постійно. Будь-яка константа, яку ви визначаєте, завжди є загальнодоступною з будь-якого місця і не може бути обмежена результатами викликів функцій.


6

Це досить давнє запитання, але, можливо, ця відповідь все ж може допомогти комусь іншому.

Ви можете емулювати публічну константу, яка обмежена в межах області класу, застосувавши ключове ключове слово до методу, який повертає заздалегідь визначене значення, наприклад:

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();

3

Ви можете визначити константу класу в php. Але ваша константа класу також буде доступна з будь-якого екземпляра об'єкта. Це функціональність php. Однак, починаючи з php7.1 , ви можете визначати константи класу за допомогою модифікаторів доступу ( public, privateабо protected).

Навколо можна було б визначити вашу константу як privateабо, protectedа потім зробити їх читабельними за допомогою static function. Ця функція повинна повертати константи, лише якщо їх викликати із статичного контексту.

Ви також можете створити цю статичну функцію у своєму батьківському класі та просто успадкувати цей батьківський клас у всіх інших класах, щоб зробити його функцією за замовчуванням.

Подяки: http://dwellupper.io/post/48/defining-class-constants-in-php

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.